SoftimageRu Форум -> Интерпретация формул в ICE tree

Новости • Форум • Помощь • Поиск • Участники • Календарь • База


Страницы: (2) [1] 2   ( Перейти к первому непрочитанному сообщению ) Ответ в темуОтвет      Создание новой темыНовая тема   

> Интерпретация формул в ICE tree, для бегинеров, овцам не смотреть 8)   
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
Небольшая заметка по айсу. Навеяно недавней просьбой Кубика собрать сценку, где по простым формулам параболы можно собрать дерево, отображающее их во вьюпорте. Может кому-то ещё будет полезной. Все сказанное в статье является моей имхой и на 100% и даже на 50% точность не претендует, так что читайте на свой страх и риск :)
Сборка дерева по формулам в айсе не представляет особой сложности, надо всего лишь привыкнуть к нодовой логике и некоторым особенностям айса. Для начала надо понять, над чем конкретно необходимо произвести вычисления, так как именно это и служит затыком. Рассмотрим несколько случаев на примере.
Простое использование айса как калькулятора. Да, такое может быть и я даже таким иногда пользуюсь, ибо математика там представлена довольно большим количеством операций, произвести которые в матКаде или ещё где-то представляет собой определенную сложность с необходимостью всю эту байду ставить и изучать, например недавно мне было нужно для лабораторной по мат-статистике решить систему уравнений матричным способом, и надо было найти детерминант матрицы, что естественно вызывает дикий баттхерт если все это время не появляться на парах, но тут я как нельзя вовремя вспомнил, что в айсе есть такая штука - и всё! ( надо сказать, что подфартило с размером матрицы, у меня было 4х4, как раз такие айс поддерживает ), но в общем не суть, это отступление. Использовать специфические функции айса вместо калькулятора лучше всего на нолях ( null ) , так как эти объекты обладают контекстом per-Object и никаких неожиданностей с его скачком не возникает. Пример - необходимо посчтитать выражение, скажем, такое – x*x*x + 25y + 567*sin(2PI).
Как такое собрать? Начинать нужно с мысленного разделения выражения на части, которые будут вычисляться последними. Как известно( надеюсь ) сначала вычисляется умножение\деление, потом уже сложение-вычитание. Поэтому делим так – часть 1) x*x*x \\ часть 2) 25y \\ часть 3) 567*sin(2PI).
Имеем три операнда, которые складываются между собой, следовательно, создаем ноду Add с тремя будущими портами (в дереве на созданном ноле конечно же)
(IMG:http://cs9446.vkontakte.ru/u37428331/142182582/x_8ee8225d.jpg)
Далее наши операнды делим на более мелкие части, первую часть делить не надо, есть нода возведения в степень ( хотя иногда быстрее создать ноду Multiply и туда три раза воткнуть один и тот же х ) Exponent – почему она так называется для меня загадка, видимо пендосский диалект, ибо на русском экспонента – это грубо говоря константа 2.72блаблабладобесконечности…… использующаяся матанщиками в дифф. исчислении. Порт Power – это степень ( три у нас ) , бейс – соответственно основание ( возводимое в степень ). Сам Х тут можно не вставлять как отдельную ноду ( хотя можно – нода-константа scalar ), можно просто вписать значение в портах, однако нода-константа выглядит намного читабельнее ( особенно с комментариями ). Далее, вторая часть так же не представляет труда, а вот в третьей надо сделать замечание, что число ПИ в айсе надо представлять в градусах, ибо ноды sin\cos и прочая тригонометрия используют именно градусы для вычисления.
Конечное дерево должно выглядеть так ( обратите внимание, что бы увидеть результат был создан пользовательский атрибут с названием debug, назвать конечно можно как угодно, лишь бы не совпало с уже имеющимися )

(IMG:http://cs9446.vkontakte.ru/u37428331/142182582/y_ce981d0c.jpg)
Так же для целей наблюдения можно использовать ноду LOG Values, которая выводит любое проходящее сквозь неё значение в скрипт эдитор, вставляя её в месте, где необходимо отслеживать данные

(IMG:http://cs9446.vkontakte.ru/u37428331/142182582/y_452ee641.jpg)
Надеюсь, тут все понятно. Идем дальше.
Рассмотренный случай выше выводил результат только для одного случая за раз, то есть для одной комбинации x \ y. При этом вполне возможно, что у нас на руках есть набор ( массив далее ) данных, которые все необходимо просчитать и даже визуализировать ( для школьников – построить график ).
Для примера возьмем параболу. Парабола представляет собой 2D фигурку-кривую грубо говоря, и использоваться соответственно будут только два измерения – Х и У. Использовать будем тот же ноль. Итак, что там у нас за формула параболы ? Лезем в гугл, находим: y = ax*x + bx + c, что обозначают эти буковки конечно можно расписать , но не лучше ли собрать формулу и подергать их самому, сразу наблюдая изменения ? Для начала все же придется кое-что прояснить – так как это функция, то есть аргумент ( x – входные данных ) и собственно сама функция ( y – который изменяется соответственно изменениям x-аргумента ). В качестве входных данных будем использовать массив, равномерно заполненный числами со значением от -5 до 5, и чисел этих скажем, будет 100. Используем штатную ноду Build Linearly Interpolated Array. Так как у нас это Х, то подставляем его в формулу как Х (кэп, ок) и строим аналогично первому примеру с разложением формулы на части ( a \ b \ c – просто ноды-константы ). Должно выйти что-то вроде этого
(IMG:http://cs9446.vkontakte.ru/u37428331/142182582/y_8244c4d6.jpg)
Теперь возникает вопрос – а как визуализировать? Так как у нас двумерный случай, то нужен нам два-дэ вектор-тип, а точнее нода Scalar to 2D vector, и так как Х у нас известен ( это исходный массив) то его пихаем в Х порт, а в Y – конец нашего дерева. К сожалению, два-де вектор не способен нормально отображаться во вьюпорте в виде точек, поэтому используем scalar to 3D vector где оставляем Z порт как 0. И отображаем выход как точки, да.
(IMG:http://cs9446.vkontakte.ru/u37428331/142182582/y_a4a3d2b0.jpg)
Надо заметить, что это было не каноническое уравнение, с кучей доп параметров типа абс, для следующего случая возьмем уже каноническое, правда не параболы, а параболоида, то есть будет трехмерный график.
Теперь у нас будет уже два входных аргумента, Х и У , а вычислять будем Z. Но в большинстве случаев, исходными данным служат вовсе не нагенеренные массивы, а вполне реальные числа, например точки геометрии, или поинт клауда ( точнее координаты точек, над которыми по формуле необходимо произвести деформацию ). Возьмем поинт клауд. Пустой. Создали, теперь в дереве сгенерим компаундом Generate 3D Point Grid плоскость из точек ( к слову сказать, мы поменяем местами Y и Z координаты для большей наглядности, так что не надо пугаться ) 100х1х100 и с длинной 10х10. Смотрим формулу параболоида – z = ax*x + by*y, перепишем это как y = ax*x + bz*z, и собираем, ничего сложного, должно выйти как тут
(IMG:http://cs9446.vkontakte.ru/u37428331/142182582/y_2dd6f23e.jpg)
Ну и в качестве последнего случая возьмем что-то более реальное, или полезное, не суть в общем.
Я выбрал формулу Гешеровых волн, которую когда-то тыкал как раз параллельно изучая как в айсе собирать выражения. Почерпнуть теор-инфы по данному алгоритму можно у Тессендорфа http://graphics.ucsd.edu/courses/rendering.../tessendorf.pdf
Для нас же интересная сама формула
X = X0 – ( K/k ) A sin ( K* X0 – wt )
Y = A cos ( K *X0 – wt )
Как видно, формула идет в виде двух уравнений, для вертикальной координаты У и для горизонтальных Х Z ( которые в первой части идут как два-де вектор Х\Х0 ) . Знак * в данном случае обозначает скалярное произведение векторов. K(Большое) – два-де вектор , показывающий направление волн. к(маленькое) – магнитуда ( сила\модуль ) , вычисляется как к = 2PI\Lambda, где лямбда – длина волны. w- частота, вычисляется как w*w = gk(маленькое), где g=9.8 ( гравитационная постоянная ), t – время .А – амплитуда, причем отношение Ак(малое) будет определять степень заостренности волн. X0 – начальные координаты ( горизонтальные – X и Z ) точки, Х – конечные. Имея на руках все данные, можно приступать. Волны будут естественно на плоском полигональном гриде. Создадим его как 100х100 точек. Дерево не симулированное.
Сборку целесообразнее начать с вертикальной координаты, так как она проще. Для начала раскроем полностью уравнение : Y = A cos ( dotProduct(X0;K) – sqrt(9.8*2PI/Lambda)). ( dotProduct – это скалярное произведение ).
(IMG:http://cs9446.vkontakte.ru/u37428331/142182582/y_0b434246.jpg)
В этой путанице можно разобраться только самому собрав, в конце я выложу сцену.
Воткнув эту систему в порт Y компаунда Set point position, приступаем ко второй части.
X = X.x0 – ( K.x/2PI/Lambda) A sin (dotProduct(X0;K) – sqrt(9.8*2PI/Lambda)).
Z= X.z0 – ( K.z/2PI/Lambda) A sin (dotProduct(X0;K) – sqrt(9.8*2PI/Lambda)).
Теперь мы должны получить нечто похожее на это:
(IMG:http://cs9446.vkontakte.ru/u37428331/142182582/x_d2339e77.jpg)
В компаунде, который будет в сцене, так же добавлен глобальный масштаб, суть которого в том, что мы начальные точки умножаем на некий множитель ( скажем 1000 ), а конечный результат на на обратное число ( 1\1000 ), таким образом масштабируем только эффект гешеровых волн, а не сами габариты сетки.
В заключение отмечу, что для получения более реалистичных волн необходимо смешивать несколько подобных компаундов с разными настройками ( массив настроек ). Подобная реализация так же приложена к сцене. Надеюсь, что кто-то что-то полезное отсюда почерпнет :). Спасибо за внимание.


Login require!
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 26.09.2011 - 20:19 Top
Qbick
Профиль
Статус: (╯°□°)╯︵ ┻━┻
Группа: Заслуженные артисты
Рейтинг: 11
ты щщикарен
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 26.09.2011 - 20:22 Top
/voo-doo/
Профиль
Статус: три дэ бугор
Группа: Заслуженные артисты
Рейтинг: 7
ГигаМозг !
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 26.09.2011 - 20:34 Top
Sshadows
Профиль
Статус: to Dublin, сюда блин
Группа: Элита
Рейтинг: 17
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 26.09.2011 - 21:17 Top
TemaTrance
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 5
Круто я какраз второй день учусь собирать в айсе подобные формулы с логарифмами
Mr.Core
ты правильно сказал пока сам не собереш подобное нифига не поймеш
А разобратся как оказалось очень легко :smoke:
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 26.09.2011 - 21:23 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
Sshadows
да, извиняюсь, писалось на скорую руку без проверки в верде :read:
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 26.09.2011 - 22:45 Top
kovalex
Профиль
Статус: слон
Группа: Элита
Рейтинг: 5
:dash1: Для человека, у которого тройка (с натяжкой) по школьной математике это просто непостижимо! :read: Уважаю профессионалов! :clapping:
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 27.09.2011 - 06:05 Top
Angel 07
Профиль
Статус: слон
Группа: Артисты
Рейтинг: 7
Молодец! Только занятия не надо больше пропускать по математике.
Персональное сообщениеПисьмо на e-mail пользователю
Цитировать сообщение Дата 27.09.2011 - 08:11 Top
NRat
Профиль
Статус: Серый кардинал
Группа: Серый кардинал
Рейтинг: 12
Картиночки б побольше, на предпоследней например нихрена уже не разобрать... :)
А так чо крута, да! :)
Персональное сообщениеПисьмо на e-mail пользователюICQ
Цитировать сообщение Дата 27.09.2011 - 10:28 Top
alCa
Профиль
Статус: слон
Группа: Элита
Рейтинг: 13
оч полезная статья!!! скопировал себе в хелп.
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 27.09.2011 - 10:50 Top
Wats
Профиль
Статус: слон
Группа: Модераторы
Рейтинг: 17
Mr.Core, спасибо! :good:
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 27.09.2011 - 10:52 Top
Mr.Core
Профиль
Статус: -
Группа: Модераторы
Рейтинг: 17
Angel 07
Да я и не особо их в школе пропускал, даже на 10 из 12 вытянул кое-как :nea:
в универе да, коррупция и туча пересдач, но там совки одни, честно говоря оторванные от жизни придурки, ниразу кроме своей теории больше ничего не пробовавшие и знать не знающие, что большинсвто возникающих в реале задач не решаются аналитически
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 27.09.2011 - 11:21 Top
Ендукъ
Профиль
Статус: слон
Группа: Элита
Рейтинг: 14
Mr.Core Спасибо! :clapping:
Два вопроса..

1. w*w = gk(маленькое), где g=9.8 ( гравитационная постоянная ), t – время - что тут не так.. к маленькое - это таки шо такое? :blush2: :)

2. Вчера пытался выложить сценку, почему-то не получилось это сделать в раре.. а у тебя зип прошел. Это только для заслуженных артистов, или сайт именно рары недолюбливает?
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователя
Цитировать сообщение Дата 27.09.2011 - 12:19 Top
alCa
Профиль
Статус: слон
Группа: Элита
Рейтинг: 13
ну у учителей нет задачи имхо научить как жить в реале, у них задача показать какие в наличии есть инструменты чтобы их ты мог (или не мог) пользовать в реале.
Про троешников, я когда на кб практику проходил да и на дипломе мне всё говорили что самые лучшие сотрудники это бывшие троешники или хорошисты, а отличники как привыкли в школах зубрить, так они по сути и остались зубрилами теоретиками от которых пользы скажем так меньше.

ендук, тут есть ограничение по размеру файла, 400кб кажеца
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 27.09.2011 - 12:23 Top
Sherkon
Профиль
Статус: Невидимый
Группа: Заслуженные артисты
Рейтинг: 11
Mr.Core
:good: а некоторые картинки и вправду бы покрупнее!
Персональное сообщениеПисьмо на e-mail пользователюСайт пользователяICQ
Цитировать сообщение Дата 27.09.2011 - 12:32 Top
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Страницы: (2) [1] 2  Ответ в темуОтвет      Создание новой темыНовая тема   

 

Текстовая версия