Render.ru

Проблема с направлением объектов вдоль кривой

Рейтинг
24
#1
Пытаюсь сделать простую вещ: пустить предметы по кривой, чтоб они смотрели вдоль направления кривой но при этом чтоб боковины были в одной плоскости так, как показано в рис.1. (в Максе это делается за несколько кликов)
Рис 1.jpg

Сейчас расскажу как я это делаю в Гудини и надеюсь услышать, что я не так делаю.

И так, рисую простую кривую. С помощью ноды Point-Old вычисляю нормаль каждой точки вдоль кривой путем добавления Add Edge Force. Направление записывается в атрибут edge_dir (рис. 2)
Рис 2.jpg

Далее, с помощью ноды Facet нахожу вектор перпендикулярный плоскости в которой была создана кривая (рис 3)
Рис 3.jpg

Далее, добавняю ноду Pointvop и в ней вычисляю трерию нормаль через ноду crossproduct подсоединяя к ней две найденые нормали. (рис 4).
Рис 4.jpg
Казалось бы все нормали/вектора правильно вычеслены. Но, как можно видеть на рис. 5, кубы хоть и направлены вдоль результата crossproduct, но они еще и крутятся вокруг него!
Рис 5.jpg

Что я не так делаю? Как исправить?
 

maiden666

Мастер
Рейтинг
110
#2
не пойму смысла большинства твоих действий (то есть понял бы, если б ты собирал вручную Rotation Matrix)
Всё, что тебе нужно, это нормаль, по которой будут выравниваться локальные оси Z,( в данноом случае это тангент), и ап-вектор, по которому выравниваются локальные оси Y. И то, и другое можно получить в ноде Полифрейм
https://c2n.me/3SV5kTI
 

виталий антоновас

Модератор форума
Команда форума
Рейтинг
318
#3
Казалось бы все нормали/вектора правильно вычеслены. Но, как можно видеть на рис. 5, кубы хоть и направлены вдоль результата crossproduct, но они еще и крутятся вокруг него!
нет, не правильно, ну почти правильно, только у тебя ошибка. Ты в VOPе один и тот же вектор подаеш и в N и в up. Тебе N нужно исползоват для вычисления кросс-продукта, но и он же, без изменений должен идти дальше, опять в N (оутпут). в общем, еще раз, ты просто одним и тем же значением переписал две переменные.
 

виталий антоновас

Модератор форума
Команда форума
Рейтинг
318
#4
Рейтинг
24
#5
не пойму смысла большинства твоих действий (то есть понял бы, если б ты собирал вручную Rotation Matrix)
Всё, что тебе нужно, это нормаль, по которой будут выравниваться локальные оси Z,( в данноом случае это тангент), и ап-вектор, по которому выравниваются локальные оси Y. И то, и другое можно получить в ноде Полифрейм
https://c2n.me/3SV5kTI
Я только недавно начал изучать Гудини, поэтому, из за недостатка знаний, сейчас много чего делается не очень рационально ). Спасибо за ноду Polyframe. Я о ней не знал.
НО! теперь мне в двойне стаоло интересно разобраться, как можно вручную выставить ориентацию объектов! Можно сказать, что это просто пытливость ума. Я слабо представляю как это сделать, но предполагаю, что возможно как-то через Copy Stamp используя вкладки Stamp и Attribute. Нужно как-то перенести вычесленые вектора на копии объекта.

нет, не правильно, ну почти правильно, только у тебя ошибка. Ты в VOPе один и тот же вектор подаеш и в N и в up. Тебе N нужно исползоват для вычисления кросс-продукта, но и он же, без изменений должен идти дальше, опять в N (оутпут). в общем, еще раз, ты просто одним и тем же значением переписал две переменные.
Вот так что ли, как на картинке?
Рис 6.jpg

up_vector есть но он ни как не задействован. Как я написал выше в этом сообщении, я хочу в ручную попробывать выставить направление объектов. Вот только не понимаю как.
 
Последнее редактирование:
Рейтинг
24
#7
Спасибо но это не то. Я хочу сделать то же самое что делает Polyframe, только в ручную. Желательно без VEX т.к. я его еще не знаю ). Данный код я не очень то понял, лишь переписал его и вижу что он крутит все объекты одинаково не беря в расчет направление векторов точек кривой.
 

виталий антоновас

Модератор форума
Команда форума
Рейтинг
318
#8
Вот так что ли, как на картинке?
да...почти))Чисто технически правильно. Только up не нужно называть up_vector, Houdini не поймет его, есть "заброниробанное" название , просто "up".Второе,у тебя на N что приходит? Откуда VOP знает, какая у тебя нормаль? я чуть позже соберу пример, и разложу по полочкам, я когда давно начинал, мне ета тема тоже покоя не давала))
 

виталий антоновас

Модератор форума
Команда форума
Рейтинг
318
#9
итак,поехали.Будет несколько постов. В некоторых случях обьяснения могут показаться "детскими", ето для того, чтоб как можно живее представить некоторые вещи.
Рисунок 1. Нода Polyframe делает нам касательные (тангенсы) к кривой. Можно по умолчанию оставить название атрибута, которое там есть, но я для удобства пишу "N", он просто в етом случае касательные мне записывает сразу в нормали, и включив которые, можно визуально посмотреть,куда они направлены. Ето чисто для скорости и удобства. Представим, что сейчас нормали играют роль некоей нитки,на которую будут насаживаться наши бусы.Также, нормали играют роль направляющих, куда будут смотреть наши предметы.
 

Вложения

  • 79,1 КБ Просмотров: 248

виталий антоновас

Модератор форума
Команда форума
Рейтинг
318
#10
если сейчас поставим ноду Copy, ничего не меняя и не трогая,по умолчанию, то увидим, что наши предметы, имея ТОЛьКО информацию о том, куда смотреть, в принципе ведут себя предсказуемо. Чайник по умолчанию смотрит носиком по оси "Х", нормали у нас есть, и на основе етой информации чайники так и легли.Рисунок 2.
 

Вложения

  • 74,7 КБ Просмотров: 236

виталий антоновас

Модератор форума
Команда форума
Рейтинг
318
#11
едем дальше. Так как у нас сейчас информация только о направлении КУДА смотреть нашим бусам, то при изменении кривой, при анимации например) наши бусы будут вертеться вокруг своей оси(в данном случае ето наши направляющие-нормали).Чтобы ето избежать, используется вектор "up". Етот вектор играет роль некоей "булавки", которая пришпиливает наш обьект к нитке намертво, не давая ему вертеться.И как можно догадаться по названию, ето вектор показывает куда будет смотреть верх нашего обьекта.Ето как если представить, что вы прикалываете булавками бабочек ,например на сферу. И булавка и будет нашим up-вектором.После ноды Polyframe делаем VOP и внутри делаем нехитрую систему.Здесь мы просто создаем вектор up и назначаем, например, ему значение по оси "Х". Пришпиливаем наши обьекты, скажем так, со стороны "Х".
 

Вложения

  • 91,5 КБ Просмотров: 186

виталий антоновас

Модератор форума
Команда форума
Рейтинг
318
#12
тепрь если посмотреть сбоку, нам видна такая картина:
Наши предметы по-прежнему направлены (нанизаны) по нормалям, а up вектор просто развернул их(на картинке мы смотрим как раз по направлению up вектора).
 

Вложения

  • 35,2 КБ Просмотров: 223

виталий антоновас

Модератор форума
Команда форума
Рейтинг
318
#13
Диспозиция такая(по Рисунку 4):
Нормали смотрят в сторону "Z", up вектор смотрит на нас (ось "Х"). Переходим к кросс продукту.
 

виталий антоновас

Модератор форума
Команда форума
Рейтинг
318
#14
немного теории: Как известно кросс продукт на основании двух векторов выдает третий, который ВСЕГДА будет перпендикулярен первым двум. Теперь, чтобы развернуть обьекты "правильно", нам нужно, чтоб up вектор смотрел вверх (он же up вектор :)) ). Исходя из наше диспозиции логически предположить, что наш вектор должен смотреть по оси "Y". Так как нормали смотрят по Z , то чробы получить вектор по Y нам нужен...конечно же Х! Перпендекуйляр к Z и Х будет всегда Y. Пробуем. Делаем кросс-продукт N и вектор по Х. Профит.
В ноде Copy ничего не надо добавлять, прописывать, кривая автоматом ("по наследству") передает все необходимые атибуты для вращения и направления обьектов.
 

Вложения

  • 104,9 КБ Просмотров: 246
Рейтинг
24
#16
если ето было не сложно, то позже могу написать как вращать обьекты вокруг N и вокруг up
Спасибо! Все оказалось гораздо проще чем я думал.
Я смог повторить все то же самое и с помошью ноды Point-Old используя этот пример имея атрибут edge_dir.
Да, было бы интересно узнать и про вращение объектов, если не сложно ).
 
Сверху