Render.ru

Соединения в молекуле.

Aleksandr Ryzhov

Пользователь сайта
Рейтинг
2
#1
Здравствуйте! Я новичёк в 3ds Max. Задача создать некую молекулу(необязательно такая в реальности должна существовать). В начале координат находится центральный шар. В пространстве находятся допустим 6 других шаров меньшего радиуса, координаты этих шаров произвольны и должны вводится из текстового файла. Вопросы такие: хочу создать соединения в виде тонких цилиндров, как мне задать положение этих цилиндров, чтобы они соединяли данный шар с центральным? Что нужно сделать чтобы вся молекула воспринималась как целое(наверное аналог group в 3ds Max), чтобы в дальнейшем задать движение и вращение данной молекулы относительно центра? Всё нужно сделать именно в MaxScript(задание в универе такое).
P.S. Помогите плиз ламеру.
 

Protactinium

Пользователь сайта
Рейтинг
2
#5
Если нужно именно цилиндры использовать для соединений в молекуле, то можно сделать так:

1. Вычислить вектор между центрами двух шаров. v1 = $Sphere02.pos - $Sphere01.pos
2. Исходный цилиндр должен стоять в начале координат и направлен вверх.
Тогда вектор его оси будет v2 = [0,0,1]
3. Итоговая ориентация цилиндра определяется матрицей поворота совмещающей вектора v1 и v2.
Есть матрица поворота вокруг единичного вектора (оси) на заданный угол. Ее можно найти на
википедии по запросу "матрица поворота".
4. Единичный вектор вокруг которого происходит вращение равен векторному произведения векторов
v1 и v2: a = normalize (cross v1 v2).
5. Сам угол между векторами не нужен, нужен только его косинус. Косинус этого угла равен скалярному
произведению этих векторов, при условии что они нормализованны:
v1 = normalize v1
v2 = normalize v2
prod = v1.x*v2.x+v1.y*v2.y+v1.z*v2.z
cos_ang = prod
6. понадобится также синус этого угла:
sin_ang = sqrt(1 - cos_ang*cos_ang)
7. Матрица ориентации цилиндра будет иметь вид:
MR = matrix3 0
MR.row1 = [(cos_ang + (1 - cos_ang)*a.x*a.x), ((1 - cos_ang)*a.x*a.y - sin_ang*a.z), ((1 - cos_ang)*a.x*a.z + sin_ang*a.y)]
MR.row2 = [((1 - cos_ang)*a.y*a.x + sin_ang*a.z), (cos_ang + (1 - cos_ang)*a.y*a.y), ((1 - cos_ang)*a.y*a.z - sin_ang*a.x)]
MR.row3 = [((1 - cos_ang)*a.z*a.x - sin_ang*a.y), ((1 - cos_ang)*a.z*a.y + sin_ang*a.x), (cos_ang + (1 - cos_ang)*a.z*a.z)]
8. Для итоговой матрицы трансформации цилиндра необходимо его положение. Оно совпадает с центром первой сферы:
MR.row4 = $Sphere01.pos
9. В итоге нужно просто полученную матрицу использовать в качестве матрицы трансформации цилиндра:
$Cylinder01.transform = MR

p.s. Но если не сущесвенно какими будут соединения в молекуле, по-моему, лучще соединить центры сфер сплайнами
в режиме corner и наложить на них модификатор edit_mesh. Получатся теже цилиндры, но гораздо проще... )
 

Aleksandr Ryzhov

Пользователь сайта
Рейтинг
2
#6
Не существенно какими будут соединения. А как сделать чтобы вся молекула воспринималась как целое, для дальнейшей анимации вращения?
 

kolts

Активный участник
Рейтинг
16
#7
Надо все обьекты прилинковать к центральному шару и анимировать только его
 

megavitus

Активный участник
Рейтинг
7
#8
Ну и ну, нагородили косинусов :) , всё проще

v1 = $Sphere02.pos - $Sphere01.pos
c = cylinder()
c.dir = v1
 

Aleksandr Ryzhov

Пользователь сайта
Рейтинг
2
#11
А как сделать чтобы вся молекула воспринималась как целое, для дальнейшей анимации вращения?
Надо все обьекты прилинковать к центральному шару и анимировать только его.


А как это сделать?)))
 

Protactinium

Пользователь сайта
Рейтинг
2
#12
Например так:

s1 = $Sphere01
s2 = $Sphere02
s2.parent = s1

В таком случае s2 будет прилинкована к s1
Подробнее смотри в разделе справки - General Node Properties.
 

ASK'R

Активный участник
Рейтинг
5
#14
кину свои 5 копеек
p.s. Но если не сущесвенно какими будут соединения в молекуле, по-моему, лучще соединить центры сфер сплайнами
в режиме corner и наложить на них модификатор edit_mesh. Получатся теже цилиндры, но гораздо проще... )
ну с мешем получим 2 точки, что совсем не интересно, но насчет сплайнов это очень правильно - круглый, прямоугольный вид для рендера, через Sweep (или Loft) ещё куча профилей, возможно сделать одним обьектом, возможно оптимизацию для вьюпорта (не показывать во вьюпорте окончательную геометрию)

можно слинковать, а можно и сгрупить - group $box* name:"boxes", - фломастеры же на вкус разные ;)
 
Сверху