@@canis_mjr тогда зачем вообще называть эти углы углами Эйлера? В лучшем случае это просто бесполезная для разработчика информация, а в худшем - если вдруг разработчик и столкнется с этой терминологией либо в разговоре, либо после какого-нибудь будущего обновления с4d и 3dsmax, где вдруг по какой-то причине внезапно добавят названия различных углов, то он попадет впросак и перепутает углы.
@@doctormaddyson вы правы, проще сказать три угла и всё сразу понятно. Я часто сталкиваюсь с тем, что углы Михайлова называют углами Эйлера, или наоборот, или просто три угла называют углами Эйлера или Михайлова, аж бесит. Назвался углами Эйлера, значит чётко задал последовательность поворотов и связь угол-ось. Мораль то проста, надо сначала изучать математику ^_^
Мне тут говорят что есть еще такая штука как ротор, и типо она понятнее чем кватернион и при этом работает так же. Но я не специалист в этом, утверждать ничего не могу)
Столкнулся при работе с частицами, ох и подгорело у меня. Принцип понятен, визуально вроде тоже примерно соответствует представлению, а начинаю напрямую задавать значения, какой-то бред. Спасибо за объяснение.
Я так и не понял, как этот кватерион решает проблему шарнирного замка. Я указал в VEX оси вращения по кватериону и крутанув Y на 90 градусов, далее получил такой же результат при повароте X и Z как и при Эйлере. Далее, поигрался немного с нодами типа Rotate by Quaterion. Подключил к входу ноду Quaterion и соответственно вектор, а result сумировал в ноде add с P, sum подал на вход в P в geometryvopoutput. Ожидал, что будет происходить поворот вокруг подключеного вектора, но оказалось что объект сдвинулся на длину вектора но не повернулся. А где обещянный поворот то? Или я как-то не правильно все подключил? Было бы и в правду очень полезно если бы был урок по практическому использованию кватерионов с использованием указаных нод и ситуацию как кватерион выходит их проблемного положения в отличие от Эйлера.
Спасибо за видео, но все равно образовался вопрос. Накинул на объект скаттер, на точки скаттера перекинулись нормали. Как можно эти нормали перевести в ориент аттрибут? Что бы после копи ту поинт поворачивать клоны вокруг нормали? upd. посчитал кросс продукт от нормали и вектора вверх (0,1,0) и записал его в вектор up. после этого с сайта cgwiki скопировал немного кода: matrix3 m = maketransform(@N,@up); @orient = quaternion(m); Помимо того что теория с матрицами осталась для меня в тумане, там есть еще решение по поводу поворота точек на рандомное значение, которое для меня то же непонятно как работает, тут нужно видимо углубляться в математику. Меня все еще интересует такой момент - как можно в point vop повернуть точки. Например я сначала для теста взял готовый ориент (полученный из N и up), преобразовал его в вектор и сразу же обратно в кватернион, и забаиндил в аттрибут orient. Это сразу все сломало. Ну или допустим, что нужно сделать, что бы каждую точку повернуть на 45 градусов от существующей позиции. Вобщем не могли бы вы немного подробней рассказать как вращать точки?
полученный тобой ориент из нормалей и ап вектора это ориентация(это два вектора N и up), но не аттрибут orient(кватернион). Чтобы повернуть каждую точку на 45 градусов от существующей позиции, нужно в аттрибуте orient (кватернион), задать вектором ось, по которой ты хочешь производить вращение, и потом в радианах повернуть на нужный угол ((для перевода в радианы) a * pi/180, где a - угол в градусах). Например можешь в вексе на точках 1) создать два канала float angle и vector axis 2) и скормить это в аттрибут: @orient = quaternion(angle, axis);
150 лет назад математики ломали голову как описать движение в 3х-мерном пространстве. Гамильтон придумал кватернионы. Но следующее поколение математиков и физиков не осилило объект, поэтому Хевисайд все упростил до векторов, введя роторы и дивергенции. В итоге сейчас и в физике и в математике имеем массу проблем.
Стас подскажи какой эквивалент функции VEX chs - в питоне, чтобы строку из какого-нибудь окна(ну например путь до ноды, которую выбрал пользователь) вставить в код выше напечатанный drive.google.com/open?id=1_kZrYqXJpjiZS_GfHZeOd8348IU1HDUN вобщем чтоб с одной контрольной ноды все кэши пересчитывать нажав одну кнопку а не искать их по всему дереву нод
Шарнирный замок возникает везде, где есть повороты по углам Эйлера. Так что в этом случае он просто перенесется на нуль, к которому привязана камера. Надо делать несколько последовательных нулей, где каждый будет отвечать за свой поворот.
Расскажи пожалуйста, возможно ли процедурно создавать несложные текстуры для процедурно генерированых объектов в COP? Например, задача - создать коробки на палетах разных размеров и на них разместить разные эмблемы и знаки. По COP нетворку вообще не очень много информации.
Да, из коп можно читать текстуру прямо в шейдер. А в нем можно все, что можно в нодовом компоузере типа Нюка или Fusion. То есть накладывать картинки с альфой легко. Там есть и switch, которым можно переключать входные картинки через экспрешн. Большая задача - рандомить параметры в рендер-тайме из шейдера. В мантре можно поставить ноду random, читать с геометрии атрибут seed и переключать результатом текстуры. В редшифте так не получится. И придется похитрить, чтобы читать разные текстуры из копа в рендер-тайм. Возможно через анимированный параметр.
Не совсем то что имел ввиду. Нужно загрузить UV карту для куба внутрь COP (желательно без сохранения на диск). С координатами точек UV подстроенными под размер композиции (т.е. 1024х1024, 2048х2048 и т.д.) и групами, чтобы определять верх, низ и боковые примитивы. Далее зная где боковые примитивы и их координаты точек в 2д пространстве рандомно раскидать этикетки по ним, чтобы они естественно не выходили за пределы UV сетки. (для этого и координаты). Ну и уже после экспортировать в текстуру шейдера. Я себе так это представляю. Скажем в АЕ можно легко это сделать с помощью выражений. А не выходя из гудини и подстраиваясь к размерам примитивов.
Да, я об этом и говорю, можно расставить что нужно, куда нужно в КОП. Проблема лишь в том, что в шейдере ты не сможешь поменять параметры Seed внутри КОП нетворка, значит, надо как-то хитрить со скриптами. Возможно получится это сделать через Style sheets, не пробовал.
Спасибо за урок! Очень круто. Радуйте нас почаще такими видео. Станислав, подскажите пожалуйста, как добавить свой пресет кода в ноде attribute wrangle или отредактировать пресеты, которые там уже есть по умолчанию.
Рекомендую сохранять через стандарный вариант - шестеренка/Save preset. Так он сохраняется вместе со всеми дополнительно созданными параметрами, это удобнее. А вообще, эти сниппеты лежат в отдельном файле, и там специальное форматирование. Обсуждение здесь: forums.odforce.net/topic/26244-how-to-enter-my-code-presets-in-a-wrangle/
В имени файла пишешь выражение типа image_$F4.exr - вместо $F4 подставится номер кадра из секвенции. Потом эту секвенцию затягиваешь в компоузер или монтажку.
2 вопросика - ты говоришь о том, что оси должны быть нормализованы, однако в случае оси {1,1,0}, она очевидно, не нормализована, и что делать в этом случае? Qconvert в этом случае выдаёт некорректный результат, а если нормализовать - вообще дикий. Второй вопрос - я использую Quaternion + Qrotate для поворота геометрии, однако, как-бы я не ухищрялся, поворот всегда происходит вокруг начала координат, хотя я на вход для оси подавал вектора, полученные разными способами, типа {1,0,0}+@P, надеясь, что это сдвинет ось в позицию точки, но фигушки...Ну собственно вопрос - как задать произвольную ось, то-есть находящуюся в нужной мне точке пространства?
По поводу Pivot. Вообще главная задача Orient - это вращение копируемой на частицы геометрии. Если нужно просто повернуть один объект, то есть такой вариант: 1. Сохраняем исходную позицию, двигаем объект в центр координат (@P-центроид) 2. Вращаем кватернионом. 3. Восстанавливаем позицию. Это можно сделать в одном Воп. Берем Bbox от первого входа, его выходы подаем на Average (чтобы найти центроид), Subtract (P-центроид), результат подаем как вектор в Qrotate. Выход Qrotate прибавляем к @P и выводим в позицию. Если объектов много, это вставляется в цикл по ним. Ну или можно сделать одну точку, на ней создать Orient и скопировать геометрию на нее.
@@hipnc конечно же я знаю про Normalize. А, возможно я тут просто прохлопал ушами - если использовать вектор 110, входная величина угла 45 не соотвествует той, что мы видим в в атрибуте @ang на выходе после qconvert, (31.8) но это видимо, потому, что это проекции осей, а сферический угол наверное те самые 45 (я надеюсь) c2n.me/3Zg9Yep
@@hipnc А, да, спасибо что напомнил, метод с переносом в начало координат мне попадался, где-то в заметках у меня есть Копирование на точку не подходит, мне нужно повернуть массу обьектов, и даже в идеале не обьектов, а отдельных точек каждого куска, которые должны поворачиваться с разной силой, в зависимости от атрибута(представь например кусочки облупившейся краски, края загибаются сильнее вдоль трещины, была мысль для каждого кусочка создать ось вращения в центре, и угол поворота привязать к расстоянию пойнта до этого центра, но не вышло, всё крутится вокруг нуля...
Это лучшее объяснения практического применения кватернионов. Большое спасибо за Вашу работу!
У меня профессор в ВУЗе объяснить не мог, а ты за 20 минут управился, дай бог здоровья, братец
вот это поворот)
Традиционно - четко, просто и понятно. Огромное спасибо!
Спасибо за человеческое объяснения сути кватернионов!
Первое действительно понятное и наглядное объяснение того, что же такое Кватернионы. Миллион спасибо!
Блин, как же долго я искал хоть какой то тутор по работе с камерой.
Очень толковое видео
Углы, обозначающие поворот вокруг осей x,y,z - это не углы Эйлера, это самолётные или корабельные углы. Углы Эйлера задаются совсем по-другому
Это ролик для тех кто не знает что такое математика и механика))
@@canis_mjr тогда зачем вообще называть эти углы углами Эйлера? В лучшем случае это просто бесполезная для разработчика информация, а в худшем - если вдруг разработчик и столкнется с этой терминологией либо в разговоре, либо после какого-нибудь будущего обновления с4d и 3dsmax, где вдруг по какой-то причине внезапно добавят названия различных углов, то он попадет впросак и перепутает углы.
@@doctormaddyson вы правы, проще сказать три угла и всё сразу понятно. Я часто сталкиваюсь с тем, что углы Михайлова называют углами Эйлера, или наоборот, или просто три угла называют углами Эйлера или Михайлова, аж бесит. Назвался углами Эйлера, значит чётко задал последовательность поворотов и связь угол-ось.
Мораль то проста, надо сначала изучать математику ^_^
Ух, как класно!!! Большущее спасибо за такой урок!
Доктор Стас! Спс!
Восторг!
Мне тут говорят что есть еще такая штука как ротор, и типо она понятнее чем кватернион и при этом работает так же. Но я не специалист в этом, утверждать ничего не могу)
Спасибо за такие полезные уроки!
Стас, спасибо - нереально полезный урок.
огромная благодарность
Спасибо за урок! Ждем практики)
Спасибо, очень полезно. Сам я работаю в Unity, где ситуаций с поворотами море, так что данное видео пришлось в тему.
Отлично! про Gimbal Lock хорошо описано
Спасибо за Ваши труды
Спасибо, было полезно. Отдельное спасибо за 13:10
Спасибо за урок! По чаще бы что-то из обыденного для вас, а для новичков - новое будет!
Столкнулся при работе с частицами, ох и подгорело у меня. Принцип понятен, визуально вроде тоже примерно соответствует представлению, а начинаю напрямую задавать значения, какой-то бред. Спасибо за объяснение.
Только за одно упоминание углов Эйлера ставлю +
Спасибо большое , как всегда грамотно и доступно
Я так и не понял, как этот кватерион решает проблему шарнирного замка. Я указал в VEX оси вращения по кватериону и крутанув Y на 90 градусов, далее получил такой же результат при повароте X и Z как и при Эйлере.
Далее, поигрался немного с нодами типа Rotate by Quaterion. Подключил к входу ноду Quaterion и соответственно вектор, а result сумировал в ноде add с P, sum подал на вход в P в geometryvopoutput. Ожидал, что будет происходить поворот вокруг подключеного вектора, но оказалось что объект сдвинулся на длину вектора но не повернулся. А где обещянный поворот то? Или я как-то не правильно все подключил?
Было бы и в правду очень полезно если бы был урок по практическому использованию кватерионов с использованием указаных нод и ситуацию как кватерион выходит их проблемного положения в отличие от Эйлера.
Круто! Спасибо за урок!
Я этот видос неделю искал! тоже столкнулся с поворотом на 90 град и тем что ось пропадает. ох бедаа....
Спасибо за урок!
Спасибо за видео, но все равно образовался вопрос. Накинул на объект скаттер, на точки скаттера перекинулись нормали. Как можно эти нормали перевести в ориент аттрибут? Что бы после копи ту поинт поворачивать клоны вокруг нормали?
upd. посчитал кросс продукт от нормали и вектора вверх (0,1,0) и записал его в вектор up.
после этого с сайта cgwiki скопировал немного кода:
matrix3 m = maketransform(@N,@up);
@orient = quaternion(m);
Помимо того что теория с матрицами осталась для меня в тумане, там есть еще решение по поводу поворота точек на рандомное значение, которое для меня то же непонятно как работает, тут нужно видимо углубляться в математику.
Меня все еще интересует такой момент - как можно в point vop повернуть точки. Например я сначала для теста взял готовый ориент (полученный из N и up), преобразовал его в вектор и сразу же обратно в кватернион, и забаиндил в аттрибут orient. Это сразу все сломало. Ну или допустим, что нужно сделать, что бы каждую точку повернуть на 45 градусов от существующей позиции.
Вобщем не могли бы вы немного подробней рассказать как вращать точки?
полученный тобой ориент из нормалей и ап вектора это ориентация(это два вектора N и up), но не аттрибут orient(кватернион). Чтобы повернуть каждую точку на 45 градусов от существующей позиции, нужно в аттрибуте orient (кватернион), задать вектором ось, по которой ты хочешь производить вращение, и потом в радианах повернуть на нужный угол ((для перевода в радианы) a * pi/180, где a - угол в градусах).
Например можешь в вексе на точках
1) создать два канала float angle и vector axis
2) и скормить это в аттрибут: @orient = quaternion(angle, axis);
150 лет назад математики ломали голову как описать движение в 3х-мерном пространстве. Гамильтон придумал кватернионы. Но следующее поколение математиков и физиков не осилило объект, поэтому Хевисайд все упростил до векторов, введя роторы и дивергенции. В итоге сейчас и в физике и в математике имеем массу проблем.
Наверное надо сказать и о преимуществе углов Эйлера они все же быстро работают. Кватернионы довольно затратны по вычислениям.
Наоборот кватернионы быстрее работают
Стас подскажи какой эквивалент функции VEX chs - в питоне, чтобы строку из какого-нибудь окна(ну например путь до ноды, которую выбрал пользователь) вставить в код выше напечатанный drive.google.com/open?id=1_kZrYqXJpjiZS_GfHZeOd8348IU1HDUN вобщем чтоб с одной контрольной ноды все кэши пересчитывать нажав одну кнопку а не искать их по всему дереву нод
parm=node.parm("название параметра").evalAsString()
node - это объект с выбранной нодой, естественно. Это аналог chs.
Спасибо! Буду экспериментировать
А если у нас камера, как в том же максе таргетная и анимируется таргет а не сама камера(при этом лишь меняются координаты таргетной точки)
Шарнирный замок возникает везде, где есть повороты по углам Эйлера. Так что в этом случае он просто перенесется на нуль, к которому привязана камера. Надо делать несколько последовательных нулей, где каждый будет отвечать за свой поворот.
А можно с октонионами так?
Расскажи пожалуйста, возможно ли процедурно создавать несложные текстуры для процедурно генерированых объектов в COP? Например, задача - создать коробки на палетах разных размеров и на них разместить разные эмблемы и знаки.
По COP нетворку вообще не очень много информации.
Да, из коп можно читать текстуру прямо в шейдер. А в нем можно все, что можно в нодовом компоузере типа Нюка или Fusion. То есть накладывать картинки с альфой легко. Там есть и switch, которым можно переключать входные картинки через экспрешн.
Большая задача - рандомить параметры в рендер-тайме из шейдера.
В мантре можно поставить ноду random, читать с геометрии атрибут seed и переключать результатом текстуры. В редшифте так не получится.
И придется похитрить, чтобы читать разные текстуры из копа в рендер-тайм. Возможно через анимированный параметр.
Не совсем то что имел ввиду. Нужно загрузить UV карту для куба внутрь COP (желательно без сохранения на диск). С координатами точек UV подстроенными под размер композиции (т.е. 1024х1024, 2048х2048 и т.д.) и групами, чтобы определять верх, низ и боковые примитивы.
Далее зная где боковые примитивы и их координаты точек в 2д пространстве рандомно раскидать этикетки по ним, чтобы они естественно не выходили за пределы UV сетки. (для этого и координаты).
Ну и уже после экспортировать в текстуру шейдера.
Я себе так это представляю. Скажем в АЕ можно легко это сделать с помощью выражений. А не выходя из гудини и подстраиваясь к размерам примитивов.
Да, я об этом и говорю, можно расставить что нужно, куда нужно в КОП. Проблема лишь в том, что в шейдере ты не сможешь поменять параметры Seed внутри КОП нетворка, значит, надо как-то хитрить со скриптами. Возможно получится это сделать через Style sheets, не пробовал.
Спасибо! Я видимо не совсем понимаю принцип связывания этого всего)
@@hipncТекстур оверрайд в редшифте работает хорошо
Спасибо за урок! Очень круто. Радуйте нас почаще такими видео. Станислав, подскажите пожалуйста, как добавить свой пресет кода в ноде attribute wrangle или отредактировать пресеты, которые там уже есть по умолчанию.
Рекомендую сохранять через стандарный вариант - шестеренка/Save preset. Так он сохраняется вместе со всеми дополнительно созданными параметрами, это удобнее. А вообще, эти сниппеты лежат в отдельном файле, и там специальное форматирование. Обсуждение здесь: forums.odforce.net/topic/26244-how-to-enter-my-code-presets-in-a-wrangle/
Ок. Спасибо!
а какое практическое применение этому "гимбл локу" зачем его сделали это-ж фактически баг? не?
Его не сделали, это просто особенность работы углов эйлера, которую необходимо учитывать.
А поворот сразу по нескольким осям кватернионом не показан
Привет, ты не мог бы подсказать, как рендерить анимацию?
Пока что все что я нашел по рендеру -- это рендер картинок через мантру
В имени файла пишешь выражение типа image_$F4.exr - вместо $F4 подставится номер кадра из секвенции. Потом эту секвенцию затягиваешь в компоузер или монтажку.
то есть полноценно рендерить в видео формате нельзя? Можно отрендерить секвенцию и сделать анимацию?
Вот пример того, что я имею в виду
вимео ком/260841030 (8:14)
он это сделал не только в гудини?
Можно из мплея сохранять в видео, но не рекомендую. Да, секвенция картинок - наше всё.
А на досуге не мог бы сделать видео обо всем, что касается рендера?
9:04
2 вопросика - ты говоришь о том, что оси должны быть нормализованы, однако в случае оси {1,1,0}, она очевидно, не нормализована, и что делать в этом случае? Qconvert в этом случае выдаёт некорректный результат, а если нормализовать - вообще дикий.
Второй вопрос - я использую Quaternion + Qrotate для поворота геометрии, однако, как-бы я не ухищрялся, поворот всегда происходит вокруг начала координат, хотя я на вход для оси подавал вектора, полученные разными способами, типа {1,0,0}+@P, надеясь, что это сдвинет ось в позицию точки, но фигушки...Ну собственно вопрос - как задать произвольную ось, то-есть находящуюся в нужной мне точке пространства?
С помощью Normalize. Это нода в Воп или функция в вексе. Она на выходе выдает вектор с длиной 1.
По поводу Pivot. Вообще главная задача Orient - это вращение копируемой на частицы геометрии.
Если нужно просто повернуть один объект, то есть такой вариант:
1. Сохраняем исходную позицию, двигаем объект в центр координат (@P-центроид)
2. Вращаем кватернионом.
3. Восстанавливаем позицию.
Это можно сделать в одном Воп. Берем Bbox от первого входа, его выходы подаем на Average (чтобы найти центроид), Subtract (P-центроид), результат подаем как вектор в Qrotate. Выход Qrotate прибавляем к @P и выводим в позицию. Если объектов много, это вставляется в цикл по ним.
Ну или можно сделать одну точку, на ней создать Orient и скопировать геометрию на нее.
@@hipnc конечно же я знаю про Normalize. А, возможно я тут просто прохлопал ушами - если использовать вектор 110, входная величина угла 45 не соотвествует той, что мы видим в в атрибуте @ang на выходе после qconvert, (31.8) но это видимо, потому, что это проекции осей, а сферический угол наверное те самые 45 (я надеюсь) c2n.me/3Zg9Yep
@@hipnc А, да, спасибо что напомнил, метод с переносом в начало координат мне попадался, где-то в заметках у меня есть
Копирование на точку не подходит, мне нужно повернуть массу обьектов, и даже в идеале не обьектов, а отдельных точек каждого куска, которые должны поворачиваться с разной силой, в зависимости от атрибута(представь например кусочки облупившейся краски, края загибаются сильнее вдоль трещины, была мысль для каждого кусочка создать ось вращения в центре, и угол поворота привязать к расстоянию пойнта до этого центра, но не вышло, всё крутится вокруг нуля...
Математики расходимся... И да, правильнее компле́ксные числа
Правильно и так, и так, во всех словарях двойное ударение. Математики обычно проверяют свои гипотезы перед отправкой.
Числа компле'ксные, а не ко'мплексные.
Нет. Можно и так, и так. Далее в Википедии указано двойное ударение.
Ты че программист?
И это "кватернионы для чайников"? Муть какая-то!
Спасибо за урок.