
Новости • Форум • Помощь • Поиск • Участники • Календарь • База |
Гость ( Вход | Регистрация ) | Выслать повторно письмо для активации |
Страницы: (2) [1] 2 ( Перейти к первому непрочитанному сообщению ) | ![]() ![]() |
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 ), таким образом масштабируем только эффект гешеровых волн, а не сами габариты сетки. В заключение отмечу, что для получения более реалистичных волн необходимо смешивать несколько подобных компаундов с разными настройками ( массив настроек ). Подобная реализация так же приложена к сцене. Надеюсь, что кто-то что-то полезное отсюда почерпнет :). Спасибо за внимание. ![]() |
Qbick Профиль Статус: (╯°□°)╯︵ ┻━┻ Группа: Заслуженные артисты Рейтинг: 11 ![]() |
ты щщикарен
|
/voo-doo/ Профиль Статус: три дэ бугор Группа: Заслуженные артисты Рейтинг: 7 ![]() |
ГигаМозг !
|
Sshadows Профиль Статус: to Dublin, сюда блин Группа: Элита Рейтинг: 17 ![]() | |
TemaTrance Профиль Статус: слон Группа: Артисты Рейтинг: 5 ![]() |
Круто я какраз второй день учусь собирать в айсе подобные формулы с логарифмами
Mr.Core ты правильно сказал пока сам не собереш подобное нифига не поймеш А разобратся как оказалось очень легко :smoke: |
Mr.Core Профиль Статус: - Группа: Модераторы Рейтинг: 17 ![]() |
Sshadows
да, извиняюсь, писалось на скорую руку без проверки в верде :read: |
kovalex Профиль Статус: слон Группа: Элита Рейтинг: 5 ![]() |
:dash1: Для человека, у которого тройка (с натяжкой) по школьной математике это просто непостижимо! :read: Уважаю профессионалов! :clapping:
|
Angel 07 Профиль Статус: слон Группа: Артисты Рейтинг: 7 ![]() |
Молодец! Только занятия не надо больше пропускать по математике.
|
NRat Профиль Статус: Серый кардинал Группа: Серый кардинал Рейтинг: 12 ![]() |
Картиночки б побольше, на предпоследней например нихрена уже не разобрать... :)
А так чо крута, да! :) |
alCa Профиль Статус: слон Группа: Элита Рейтинг: 13 ![]() |
оч полезная статья!!! скопировал себе в хелп.
|
Wats Профиль Статус: слон Группа: Модераторы Рейтинг: 17 ![]() |
Mr.Core, спасибо! :good:
|
Mr.Core Профиль Статус: - Группа: Модераторы Рейтинг: 17 ![]() |
Angel 07
Да я и не особо их в школе пропускал, даже на 10 из 12 вытянул кое-как :nea: в универе да, коррупция и туча пересдач, но там совки одни, честно говоря оторванные от жизни придурки, ниразу кроме своей теории больше ничего не пробовавшие и знать не знающие, что большинсвто возникающих в реале задач не решаются аналитически |
Ендукъ Профиль Статус: слон Группа: Элита Рейтинг: 14 ![]() |
Mr.Core Спасибо! :clapping:
Два вопроса.. 1. w*w = gk(маленькое), где g=9.8 ( гравитационная постоянная ), t – время - что тут не так.. к маленькое - это таки шо такое? :blush2: :) 2. Вчера пытался выложить сценку, почему-то не получилось это сделать в раре.. а у тебя зип прошел. Это только для заслуженных артистов, или сайт именно рары недолюбливает? |
alCa Профиль Статус: слон Группа: Элита Рейтинг: 13 ![]() |
ну у учителей нет задачи имхо научить как жить в реале, у них задача показать какие в наличии есть инструменты чтобы их ты мог (или не мог) пользовать в реале.
Про троешников, я когда на кб практику проходил да и на дипломе мне всё говорили что самые лучшие сотрудники это бывшие троешники или хорошисты, а отличники как привыкли в школах зубрить, так они по сути и остались зубрилами теоретиками от которых пользы скажем так меньше. ендук, тут есть ограничение по размеру файла, 400кб кажеца |
Sherkon Профиль Статус: Невидимый Группа: Заслуженные артисты Рейтинг: 11 ![]() |
Mr.Core
:good: а некоторые картинки и вправду бы покрупнее! |
![]() |
![]() ![]() |