Render.ru

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

Александр Филипов

Активный участник
Рейтинг
5
#1
Добрый день Друзья.

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

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

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

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

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

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

Вложения

maiden666

Мастер
Рейтинг
112
#2
В ротейшн контроллере на вращение по нужной оси вешаешь экспрешн-контроллер и в нем пишешь выражение в котором скорость вращения будет зависеть от расстояния между магнитами, как именно зависеть - тебе решать, расстояние можно узнать хелпером ExposeTМ
 

Александр Филипов

Активный участник
Рейтинг
5
#3
В ротейшн контроллере на вращение по нужной оси вешаешь экспрешн-контроллер и в нем пишешь выражение в котором скорость вращения будет зависеть от расстояния между магнитами, как именно зависеть - тебе решать, расстояние можно узнать хелпером ExposeTМ
Но у меня в "Rotation controllers" отсутствует Expression. Он имеется только в "Position" и "Scale" контроллерах судя по выпадающему списку.
 

Вложения

  • 32,5 КБ Просмотров: 343

maiden666

Мастер
Рейтинг
112
#4
Дружище, я с телефона, поэтому файлы-вложения мне смотреть проблематично, но его не может не быть....э..возможно вначале надо заменить Эйлер на RotationXYZ и потом уже на нужной оси искать экспрешн, я последний раз этим занимался полгода назад и без компании перед глазами не очень помню
 

INCUS

Знаток
Рейтинг
29
#6
возможно вначале надо заменить Эйлер на RotationXYZ
это выражение я тож немного не понял.
--------

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

Александр Филипов

Активный участник
Рейтинг
5
#7
там кнопка сверху выпадет список с контроллерами.,. (это там)
Наконец разыскал местоположение кнопок и контролёров. Но поэкспериментировав с кнопками в окне контролёра Expression, так и не понял каким образом всё это можно применить в работе. В интернете ничего почитать для чайников не нашёл. Всё что я смог сделать, это найти радиус своего крутящегося диска с помощью линейки Tape.

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

Александр Филипов

Активный участник
Рейтинг
5
#8
В ротейшн контроллере на вращение по нужной оси вешаешь экспрешн-контроллер и в нем пишешь выражение в котором скорость вращения будет зависеть от расстояния между магнитами, как именно зависеть - тебе решать, расстояние можно узнать хелпером ExposeTМ
Как задать, а затем и управлять скоростью вращения диска? Для скорости вращения есть отдельный контроллер? А также как сделать, чтобы объекты "чувствовали" расстояние между друг другом и реагировали на его изменение? Это ведь надо как-то сделать чтобы один объект зависел от другого.. Взаимодействие между объектами.
 
Последнее редактирование:

INCUS

Знаток
Рейтинг
29
#9
Там нужно задавать имена переменным, которые будут участвовать в твоей формуле.
Но, каждая созданная переменная должна брать откуда-то значения, поэтому есть кнопка Assign Controller, для связки переменной и контроллера нужного трека(оси). А константы для постоянных величин, типа Пи (хотя для Пи есть отдельное дефолтное обозначение pi) ну, или коэффициент там какой-нибудь, который тож может участвовать.
 

Александр Филипов

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

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

Вложения

  • 22,7 КБ Просмотров: 343

Александр Филипов

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

Вложения

Последнее редактирование:

maiden666

Мастер
Рейтинг
112
#12
Писал же про хэлпер ExposeTM который позволяет кроме прочего динамически измерять расстояния
 

Александр Филипов

Активный участник
Рейтинг
5
#13
Писал же про хэлпер ExposeTM который позволяет кроме прочего динамически измерять расстояния
Я знаю.. Но это уже не требуется. Необходимо прописать выражение для длины линейки. Теперь линейка будет динамически измерять расстояние, так как концы линейки прикреплены к центрам наших магнитов. Если один из магнитов вращается, вместе с ним изменяется и длина линейки. Осталось только отлавливать длину линейки и производить с ней соответствующие вычисления. Вот здесь в 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)". Можно по всякому, в зависимости от того, что с чем сравниваем.
 
Последнее редактирование:

igorznag

Мастер
Рейтинг
103
#14
Берём любой язык программирования(например php) и увидим, что синтаксис оператора сравнения будет таким
Используйте контроллер 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";
)
 

Александр Филипов

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