1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Взаимодействие объектов

Тема в разделе "Анимация", создана пользователем Александр Филипов, 5 сен 2015.

Модераторы: Артер
  1. Александр Филипов

    Александр Филипов Активный участник

    С нами с:
    14.01.2012
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    5
    Добрый день Друзья.

    На днях занялся построением электродвигателя. Как известно, в любом подобном двигателе, имеется статор(неподвижная часть) и ротор(вращающаяся часть двигателя). В классическом варианте, на статоре, расположены катушки индуктивности, на которые в нужный момент подаётся электрический ток, что приводит к возникновению вокруг катушек магнитного поля. А на роторе, расположены магниты, которые это магнитное поле воспринимают и отталкиваются от него. За счёт этого и происходит вращение ротора. Этому обучаются в школе на уроке физики.

    Я максимально упростил модель двигателя, убрал катушки, вместо них вставил ещё один магнит и наконец уменьшил общее количество магнитов. Всё изображено на рисунке, прикреплённом к этому сообщению. Как видно из рисунка, диск крутится против часовой стрелки. Магнит М1 приближаясь к магниту М2 будет отталкиваться от него и не позволит крутящемуся диску прокрутиться дальше.

    Каким образом перенести всю эту модель в 3ds max? И не просто сделать красивую анимацию, а имитировать магнитное поле вокруг магнитов, в соответствии с законами физики.

    Полагаю подобная работа должна выполняться в два этапа:

    1. Создание модели
    2. Навешивание на крутящийся диск ограничение по вращению.

    Первый этап мною пройден. Со вторым этапом возникли проблемы. Стало быть эти два магнита, на нашем рисунке, должны как-то друг с другом взаимодействовать. Чтобы при приближении, они начинали "чувствовать" друг друга. И более того, чем ближе они приближаются друг к другу, тем сильнее они друг от друга отталкиваются. Есть в 3ds max контроллёры. А вот какой из них применить, я не знаю. Прошу вашей помощи.
     

    Вложения:

    • 94ifi45.png
      94ifi45.png
      Размер файла:
      58,5 КБ
      Просмотров:
      88
  2. maiden666

    maiden666 Знаток

    С нами с:
    06.04.2010
    Сообщения:
    3.089
    Симпатии:
    87
    Баллы:
    73
    В ротейшн контроллере на вращение по нужной оси вешаешь экспрешн-контроллер и в нем пишешь выражение в котором скорость вращения будет зависеть от расстояния между магнитами, как именно зависеть - тебе решать, расстояние можно узнать хелпером ExposeTМ
     
    Александр Филипов нравится это.
  3. Александр Филипов

    Александр Филипов Активный участник

    С нами с:
    14.01.2012
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    5
    Но у меня в "Rotation controllers" отсутствует Expression. Он имеется только в "Position" и "Scale" контроллерах судя по выпадающему списку.
     

    Вложения:

    • asdf.png
      asdf.png
      Размер файла:
      32,5 КБ
      Просмотров:
      85
  4. maiden666

    maiden666 Знаток

    С нами с:
    06.04.2010
    Сообщения:
    3.089
    Симпатии:
    87
    Баллы:
    73
    Дружище, я с телефона, поэтому файлы-вложения мне смотреть проблематично, но его не может не быть....э..возможно вначале надо заменить Эйлер на RotationXYZ и потом уже на нужной оси искать экспрешн, я последний раз этим занимался полгода назад и без компании перед глазами не очень помню
     
    Александр Филипов нравится это.
  5. maiden666

    maiden666 Знаток

    С нами с:
    06.04.2010
    Сообщения:
    3.089
    Симпатии:
    87
    Баллы:
    73
    Опять тупой андроид заменил комп на компанию
     
  6. INCUS

    INCUS Знаток

    С нами с:
    03.08.2010
    Сообщения:
    857
    Симпатии:
    30
    Баллы:
    29
    это выражение я тож немного не понял.
    --------

    Експрешн можно назначить только на определённую ось, раскрыв список осей у контроллера вращения - Rotation : Euler XYZ.
    Выделил объект > Motion > Assign Controller >раскрыл оси Rotation: Euler XYZ > выделил нужную ось, и назначаешь, там кнопка сверху выпадет список с контроллерами.,. (это там)
    А если назначить на весь Euler XYZ, то такой контроллер будет там называться Rotation Script.
     
    Александр Филипов нравится это.
  7. Александр Филипов

    Александр Филипов Активный участник

    С нами с:
    14.01.2012
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    5
    Наконец разыскал местоположение кнопок и контролёров. Но поэкспериментировав с кнопками в окне контролёра Expression, так и не понял каким образом всё это можно применить в работе. В интернете ничего почитать для чайников не нашёл. Всё что я смог сделать, это найти радиус своего крутящегося диска с помощью линейки Tape.

    В окне Float Expression есть две кнопки "Assign to Constant" и "Assign to Controller". Мне бы понять для чего эти кнопки нужны. Это бы круто облегчило задачу. Скорее всего "Assign to Constant" нужен чтобы установить значение переменной. Но для чего нужен "Assign to Controller" не совсем ясно.
     
  8. Александр Филипов

    Александр Филипов Активный участник

    С нами с:
    14.01.2012
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    5
    Как задать, а затем и управлять скоростью вращения диска? Для скорости вращения есть отдельный контроллер? А также как сделать, чтобы объекты "чувствовали" расстояние между друг другом и реагировали на его изменение? Это ведь надо как-то сделать чтобы один объект зависел от другого.. Взаимодействие между объектами.
     
    Последнее редактирование: 5 сен 2015
  9. INCUS

    INCUS Знаток

    С нами с:
    03.08.2010
    Сообщения:
    857
    Симпатии:
    30
    Баллы:
    29
    Там нужно задавать имена переменным, которые будут участвовать в твоей формуле.
    Но, каждая созданная переменная должна брать откуда-то значения, поэтому есть кнопка Assign Controller, для связки переменной и контроллера нужного трека(оси). А константы для постоянных величин, типа Пи (хотя для Пи есть отдельное дефолтное обозначение pi) ну, или коэффициент там какой-нибудь, который тож может участвовать.
     
    Александр Филипов нравится это.
  10. Александр Филипов

    Александр Филипов Активный участник

    С нами с:
    14.01.2012
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    5
    Поставил между двумя магнитами линейку Tape, чтобы хоть как-то узнавать расстояние между магнитами. И на основе этого расстояния, если оно достигнет определённого значения, остановить вращение диска. Но не совсем понятно как прописать выражение в Expression. Я привык в программировании использовать следующий синтаксис(подходит ко многим языкам):

    Код:
    if(a >= b) {
        // выполняем
    } else {
        // не выполняем
    }
    А в Expression похоже иной синтаксис. Хотя я и сформировал переменную, которая берёт значение из значения Length нашей линейки.
     

    Вложения:

    • 4564.png
      4564.png
      Размер файла:
      22,7 КБ
      Просмотров:
      66
  11. Александр Филипов

    Александр Филипов Активный участник

    С нами с:
    14.01.2012
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    5
    Вставил в сцену Helper(point). В контроллере создал переменную "pointer" со значением его положения. И затем вставил в Expression свою переменную. Теперь, если мы вращаем поинтер, у нас вращается и диск с магнитом. Осталось вставить выражение, которое бы проверяло длину линейки. Мне нужно, чтобы если длина линейки МЕНЬШЕ или РАВНО значению 10 то диск бы останавливался. Как это прописать в Expression в виде выражения, я пока не имею представления.
     

    Вложения:

    • zasw36f.png
      zasw36f.png
      Размер файла:
      104,7 КБ
      Просмотров:
      67
    Последнее редактирование: 6 сен 2015
  12. maiden666

    maiden666 Знаток

    С нами с:
    06.04.2010
    Сообщения:
    3.089
    Симпатии:
    87
    Баллы:
    73
    Писал же про хэлпер ExposeTM который позволяет кроме прочего динамически измерять расстояния
     
  13. Александр Филипов

    Александр Филипов Активный участник

    С нами с:
    14.01.2012
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    5
    Я знаю.. Но это уже не требуется. Необходимо прописать выражение для длины линейки. Теперь линейка будет динамически измерять расстояние, так как концы линейки прикреплены к центрам наших магнитов. Если один из магнитов вращается, вместе с ним изменяется и длина линейки. Осталось только отлавливать длину линейки и производить с ней соответствующие вычисления. Вот здесь в Function List, окна Float Expression есть пункт "if(c,t,f)". Собственно if в любом языке программирования, это оператор сравнения. А в этом выражении, я сравнения не вижу. Это какое-то непонятная запись. Берём любой язык программирования(например php) и увидим, что синтаксис оператора сравнения будет таким:

    Код:
    $a = 2;
    $b = 1;
    
    if (a > b) {
        echo "Ура! 2 больше чем 1";
    } else {
        echo "Жаль! 2 меньше чем 1";
    }
    
    // ИЛИ НАПРИМЕР ВОТ ТАК
    
    if (a+b > 3) {
        echo "Ура! A + В больше чем 3";
    } else {
        echo "Жаль! A + B меньше чем 3";
    }
    А что означает эта запись "if(c,t,f)", видимо это вопрос к разработчикам этого приложения. Я бы ещё понял, если бы запись выглядела например вот так "if(c > t AND t > f)" или вот так "if(c + t - f >= 10)", а может быть вот так "if(c*t/f < c+t-f)". Можно по всякому, в зависимости от того, что с чем сравниваем.
     
    Последнее редактирование: 6 сен 2015
  14. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Используйте контроллер Float Script вместо контроллера Float Expression.
    В нем можно использовать все выражения языка MaxScript:
    Код:
    a = 2;
    b = 1;
    
    if (a > b) then
    (
        print "a is bigger than b";
    ) else (
       print "a is smaller than b";
    )
     
    Александр Филипов нравится это.
  15. maiden666

    maiden666 Знаток

    С нами с:
    06.04.2010
    Сообщения:
    3.089
    Симпатии:
    87
    Баллы:
    73
    Меня лично в скрипт-контроллере слегка ставит в тупик выражение dependsOn
     
  16. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Почему? Выражение dependsOn не работает правильно?
     
  17. Александр Филипов

    Александр Филипов Активный участник

    С нами с:
    14.01.2012
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    5
    Рядом с записью "if(c,t,f)", есть надпись на которую я сразу не обратил внимание. Там написано "conditional: value is t if c is true, else value is f". Что означает, что переменная 'с' сработает, если переменная 't' будет true, в противном случае, сработает переменная 'f'. Здесь оказывается и проверка условия сразу и выполнение действия. И всё это в одних скобках.
     
Модераторы: Артер

Поделиться этой страницей