Paladinka

Paladinka 

Houdini Technical Artist

2subscribers

89posts

Формула-помощница при ориентации геометрии в Houdini.

Давайте разберём короткую, но очень полезную строчку кода на VEX:
Если вы когда-либо сталкивались с ориентацией геометрии в Houdini, особенно в контексте copy to points или создания направленных нормалей, эта формула может оказаться незаменимой.
В этой строке:
@N — вектор
нормали (обычно указывает "вперёд", или по оси Z).{0,0,1} — это
глобальный вектор вдоль оси Z.cross(a, b) — векторное
произведение векторов a и b.
v@up — вектор
"вверх", используемый Houdini для ориентации объектов
(аналогично матрице трансформации).
Функция cross(a, b) возвращает вектор, перпендикулярный обоим входным векторам,
согласно правилу правой руки. Это часто используется для генерации базиса —
набора взаимно перпендикулярных векторов, которые определяют локальную систему
координат.
Как это помогает?
Когда вы, например, используете узел Copy to Points, Houdini может
ориентировать копируемую геометрию по атрибутам @N и @up. Вектор @N указывает направление
"вперёд", а @up помогает определить "вверх", чтобы избежать произвольного
кручения.
Если задать v@up = cross(@N, {0,0,1});, вы получаете
"вверх", который перпендикулярен нормали и глобальной оси Z.
Это работает хорошо, пока @N не
параллелен {0,0,1}, иначе векторное
произведение станет нулевым.
Возможная проблема
Если @N уже совпадает с {0,0,1} или противоположен ей, результат cross(@N, {0,0,1}) будет ноль, а v@up окажется нулевым вектором. Это
приведёт к ошибке при копировании, так как Houdini не сможет построить
корректную систему координат.
Решение: можно
добавить проверку или использовать альтернативный вектор (например, {0,1,0}), если результат
оказался слишком мал.

Справка из документации:
cross(vector a, vector b):
Returns the
cross product of two vectors. This gives a vector that is perpendicular to both
inputs.
Ссылка на документацию SideFX
Атрибут up упоминается в Copy to Points documentation:
If the up attribute is
present, it is used along with N to build a full coordinate frame.
Copying and instancing point attributes
Формула v@up = cross(@N, {0,0,1}); — это способ получить перпендикулярный вектор к
нормали и глобальной оси Z. Это полезно при построении локальной системы
координат для ориентации объектов. Однако важно учитывать случаи вырождения.
Go up