вторник, 14 июня 2011 г.

GPU-сгенерерированные процедуры анимации ветра для деревьев (Перевод) Часть 2

Renaldas Zioma
Электронные Искусства / Цифровые Иллюзии CE

Усовершенствования для анимации ветвей
В этом пункте монотонное поле ветра должно произвести убедительное древесное движение повсюду. Однако, ветви могли бы двигаться неестественным, синхронным способом. Мы хотим добавить некоторые изменения, вводя сдвиги фазы предыдущим функциям, представляющим движения ветвей. Значение сдвига фазы назначено беспорядочно для каждой ветви как шаг перед процессом. Низкое отношение корреляции среди значений сдвига фазы приведет к очень хаотическому древесному поведению ветвей, и наоборот.
Инерция - другая важная визуальная собственность движения ветвей. Мы предлагаем смоделировать эффект инерции при использовании информации от шага моделирования ствола, чтобы изменить ранее обсужденные эффекты сдавления и сгиба (или скорее амплитуды). Желательный визуальный эффект состоит в том, что ветви, прижатые к стволу, будут выпущены, в то время как дерево качается в направлении против ветра. Такой эффект и создает понятие инерции.
Если точные параметры чопорности требуются для каждой ветви, следующая формула, упомянутая в 2003 Ota, может использоваться, чтобы изменить амплитуды параметрических движений:
где E - упругий модуль, определенный для каждой древесной разновидности и b, t, и l - ширина, толщина, и длина ветви, соответственно.

6.4 Шаг Моделирования

Предложенный стохастический подход к анимации дерева может быть сделан полностью на GPU. Наш подход имеет преимущество моделирования, которое не запрашивает информацию от предыдущих итераций; таким образом, все переходы могут быть обработаны одновременно, независимо от их позиции в иерархии. Состояние поля ветра, иерархия тела, и древесные параметры - единственные необходимые параметры для каждого шага моделирования. Необходимые параметрические функции могут быть объединены непосредственно на GPU, суммируя прогрессию простых периодических функций (таких как косинус и синус) или могут быть предварительно вычислены на центральном процессоре и переданы GPU как массив.
Поле ветра может или быть выбрано из двумерной текстуры в вершинном шейдере или получено как векторы, представляющие направление и скорость ветра из дополнительного буфера вершин как специфичные для дерева данные (используя D3DSTREAMSOURCE_INDEXEDDATA в DirectX 9). Первый подход является самым подходящим, когда поле ветра моделируется полностью на GPU. Другие необходимые входные данные, такие как иерархия, тело, noiserelated данные, и разные параметры дерева могут быть переданы GPU как константы в вершинном шейдере. 
Следующие данные связаны с каждой ветвью и передаются на GPU в массиве констант: 
  • Начало координат ветви: точка определения, вокруг которого будет вращаться ветвь
  • Основная ось ветви
  • Перпендикуляр тангенса и к основной оси данной ветви и к его родителю
  • Коэффициент чопорности ветви
  • Индекс, определяющий родительскую ветвь, или закончившийся индекс, в случае ствола
Наряду с обычной геометрической информацией, каждая вершина также сохраняет следующее:
  • Список индексов ветви, затрагивающих данную вершину (начинающийся с ветви, которой данная вершина непосредственно принадлежит и перечисляющий все родительские ветви до достигнутого корня иерархии),
  • Список весов ветви, затрагивающих данную вершину
Шаг моделирования выполняется для каждой вершины и осуществлен как  часть произвольного вершинного шейдера. 

Список ветвей, затрагивающих данную вершину, обновляется во время каждого шага моделирования. Список ветвей назначен для каждой вершины и включает в себя ветви, начинающиеся от одной, до данной вершины непосредственно и к перечисляющий все ее родительские ветви, пока не достигнут корня иерархии. Затрагивающие ветви определены заранее и сохранены в атрибутах вершины как массив индексов, как показано в иллюстрации 6-7.
Иллюстрация 6-7 Список Индексов ветви, Затрагивающих Данную Вершину, Сохраненную в Атрибутах Вершины
Для каждой ветви, затрагивающего данную вершину, угол вращения вокруг её оси вычислен, комбинируя периодические функции согласно сценариям, описанным ранее в главе. Углы вращения ветви преобразованы в представление кватерниона, как показано в иллюстрации 6-8. Конечное вращение получено, связывая все вращательные кватернионы пересеченных ветвей для данной вершины.
Иллюстрация 6-8 Угловое движение синтезируется для каждой ветви
Наш подход отличается от обычной очищающей матричной палитры (NVIDIA 2004) двумя главными способами: (1) мы синтезируем матрицы преобразования непосредственно в вершинном шейдере, и (2) мы используем операцию связи, не линейную интерполяцию, чтобы получить конечное преобразование. Распечатка 6-1 содержит типовую часть осуществления кода нашего метода.
6.4.1 Библиотека Кватерниона в HLSL
Мы выбрали кватернионы для реализации шага моделирования, потому что они удобны, компактны, и быстро работают с угловыми вращениями. Однако, вращение векторов, используя вращательную матрицу, оказалось, было намного быстрее практически. Таким образом, наша реализация использует кватернионы только во время синтеза углового движения и затем преобразовывает результат во вращательную матрицу.
Следующие связанные с кватернионом функции были осуществлены в HLSL, который будет использоваться с шагом моделирования:
1. Преобразования углов  вращения вокруг осей к кватерниону
2. Объединение (
concat) кватернионов
3. Преобразование кватерниона к матрице вращения (
Watt and Watt 1992)
Пример 6-1. Функция HLSL, Которая Моделирует Изгибающуюся ветвь 

1. float4 bendBranch(float3 pos,  
2.                   float3 branchOrigin,  
3.                   float3 branchUp,  
4. float  branchNoise,  
5.                   float3 windDir,  
6. float  windPower)  
7. {  
8.   float3 posInBranchSpace = pos - branchOrigin.xyz;  
9. float towardsX = dot(normalize(float3(posInBranchSpace.x, 0,  
10. posInBranchSpace.z)),  
11.                        float3(1, 0, 0));  
12. float facingWind = dot(normalize(float3(posInBranchSpace.x, 0,  
13. posInBranchSpace.z)),  
14.                          windDir);  
15. float a = branchSwayPowerA * cos(time + branchNoise *  
16. branchMovementRandomization);  
17. float b = branchSwayPowerB * cos(timeWithDelay + branchNoise *  
18. branchMovementRandomization);  
19. float oldA = a;  
20.   a = -0.5 * a + branchSuppressPower * branchSwayPowerA;  
21.   b *= windPower;  
22.   a = lerp(oldA * windPower, a * windPower, delayedWindPower *  
23. saturate(1 - facingWind));  
24.   float3 windTangent = float3(-windDir.z, windDir.y, windDir.x);  
25.   float4 rotation1 = quatAxisAngle(windTangent, a);  
26. float4 rotation2 = quatAroundY(b);  
27. return lerp(rotation1, rotation2, 1 - abs(facingWind));  
28. }  
Исходный текст HLSL, содержащий необходимые операции кватерниона, может быть найден на цифровом видеодиске этой книги.

6.5 Интерпретация Дерева

Шаг объединения движений использует твердые сегменты, чтобы представить ветви. Мы решили делать блендинг между двумя костями, чтобы скрыть получающуюся неестественную визуальную чопорность дерева во время рендеринга. Таким образом, каждая вершина дерева затронута двумя преобразованиями:
  • Позиция и вращение ветви, которой принадлежит вершина
  • Позиция и вращение ветви ,один шаг выше по иерархии
Единичная матрица используется как второе преобразование в случае, если ветвь - ствол, потому что это - корень иерархии.
Для каждой вершины взвешенное преобразование применено к его позиции и нормали. Тангенс вершины и бинормаль должны быть преобразованы аналогично. Отношение влияния между местными и родительскими ветвями может быть определено офлайн и сохранено в данных вершины или может быть вычислено во времени выполнения как функция расстояния между позицией вершины и началом координат ветви, измененной согласно параметру чопорности ветви.
Чтобы достигнуть лучшей производительности рендеринга, геометрический уровень деталей должен быть объединен с ранее обсужденным уровнем моделирования деталей.
6.5.1 Технология DirectX 10
Реализация подхода, представленного здесь,имеет ненужные издержки на DirectX 9, как показано в иллюстрации 6-9: преобразование ветви должно быть повторно вычислено для каждой вершины. Функциональные возможности технологии DirectX 10 позволяют нам сохранить временные результаты, следующие из моделирования, а потом повторно использовать их во время шага интерпретации, как изображено в иллюстрации 6-10, таким образом, сохраняя много операций за вершину.

Иллюстрация 6-9 Процессы GPU под технологией DirectX 9

Иллюстрация 6-10 Процессы GPU под технологией DirectX 10
Реализации для DirectX 10 разделяет шаги моделирование и скиннинга в два вершинных шейдера. Во-первых, информация о ветвях и иерархии хранится в буфере вершины вместо констант программы построения теней, как было необходимо в реализации DirectX 9. Буфер вершин, содержащий информацию о ветви, используется как входной параметр вершинного шейдера, ответственного за шаг моделирования. Когда моделирование выполнено для каждой ветви, вершинный шейдер обрабатывает каждую ветвь как отдельную вершину. Получающиеся преобразования ветви сохранены в другом временном буфере вершины, что позволяет использование технологии DirectX 10.
Затем, имеет место рендеринг фактической геометрии. Временный буфер вершин, заполненный во время шага моделирования, используется как входной параметр для вершинного шейдера скиннинга. Преобразования ветви для каждой вершины выбраны соответственно для временного буфера вершины. 

6.6 Анализ и Сравнение

У нашего подхода для процедурного характера движение деревьев в поле ветра есть следующие преимущества и недостатки.
6.6.1 Доводы "за"
  • Наш метод использует мощность GPU, синтезируя анимации в вершинных шейдерах. Кроме того, это открывает возможность для лучшей интеграции с GPU алгоритмами моделирования флюидов поля ветра (GPU-based wind-field fluid simulation), полностью обходя требуемые в других случаях считывания только что записанной информации о поле ветра из памяти.
  • Этот подход полностью совместим с GPU и приносит существенную выгоду, при обсчитывании большого количества деревьев.
  • Различные визуально важные явления могут быть моделированы с этой методикой, создавая правдоподобное движение деревьев. Дополнительно, наш метод обрабатывает местные эффекты, такие как взрывы с лёгкостью.
  • Шаг моделирования чрезвычайно параллелизуемый и не вынуждает нас сохранить информацию от предыдущего кадра.Таким образом, это можно легко адаптировать к различным многопроцессорным средам.
6.6.2 Доводы "против"
  • Реализация на Directx9 страдает от дополнительной перегрузки на каждую вершину, из-за того, что симуляция, результаты которой иначе были бы разделены между группой вершин, принадлежащих одной и той же ветви, должна повторяться. Однако, Directx10 обеспечивает способ значительно уменьшить стоимость вычислений для каждой вершины.
  • Моделирование не строго физически правильно, потому что основная цель подхода состоит в том, чтобы визуально сымитировать движения деревьев в поле ветра.
6.6.3 Результаты Производительности
Следующие аппаратные средства использовались для тестирования производительности:
  • Центральный процессор: Intel Xeon 2.33 ГГц
  • GPU: NVIDIA GeForce 8800 GTX
Таблица 6-1 показ результаты.
Таблица 6-1. Производительность Технологии DirectX 9 и Технологии DirectX 10 Реализаций Алгоритма
4 617 Вершин в объекте Технология DirectX 9 Реализаций (Миллисекунды) Технология DirectX 10 Реализаций (Миллисекунды) Двухкостевой скиннинг  без симуляции ветви (Миллисекунды)
Экземпляры класса Переходы SLOD3 SLOD2
30 2 400 1.46 1.34 0.86 1.39
100 8 000 3.90 3.82 2.32 2.22
256 20 480 9.81 9.68 5.82 5.59
1 000 80 000 38.21 37.61 22.48 21.61

6.7 Резюме

В этой главе мы описали подход синтезирования движения деревьев, в то время как они затронуты внешними силами, такими как ветер. Это основано на существующих методах моделирования древесного движения как вероятностные процессы и расширяет их, добавляя простые правила, моделируя аэродинамические свойства в поведении ветвей. Мы обеспечиваем средства для комбинирования GPU симуляции флюидов с нашим подходом, чтобы улучшить общее впечатление пользователя от ветра.  Мы также представили детализированные объяснения синтеза движения на GPU наряду с реализациями нашего подхода, основанного на Технологии DirectX 9 и Технологии DirectX 10.

6.8 Ссылки

Di Giacomo, Thomas, Stéphane Capo и François Faure. 2001. "Интерактивный Лес." В Продолжениях Еврографического Семинара на Машинной мультипликации и Моделировании, стр 65–74.
Harker, George. 2002. "Анимация Деревьев в Перемотке: Эффективное и Правдоподобное Древесное Движение." Представление для общества специалистов в области компьютерной графики 2002.
Harris, Mark J. 2004. "Быстрое Моделирование Гидрогазодинамики на GPU." В Драгоценных камнях GPU, отредактированных Randima Fernando, стр 637–665. Addison-Wesley.
Kanda, Hitoshi, и Jun Ohya. 2003. "Эффективный, Реалистический Метод для Анимации Динамических Поведений трехмерных Ботанических Деревьев." В Продолжениях Международной конференции IEEE по вопросам Мультимедиа и Экспо 2003, издание 2, стр 89–92.
Корпорация NVIDIA. 2004. "Матричная Палитра, Очищающая" NVIDIA SDK Официальный документ. Доступный он-лайн на http://download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/Direct3D9/src/HLSL_PaletteSkin/docs/HLSL_PaletteSkin.pdf.
Ota, Shin, и др. 2003. "1/fb Основанная на искажении Анимация в реальном масштабе времени Деревьев, Колеблющихся в Полях Ветра." В Продолжениях Компьютерной графики Международный 2003, стр 52–60.
Stam, Jos. 1997. "Стохастическая Динамика: Моделирование Эффектов Бури на Гибких Структурах." Форум Компьютерной графики 16 (3), стр 159–164.
Watt, Alan, и Mark Watt. 1992. Продвинутая Анимация и Методы исполнения. Addison-Wesley. См. стр 363–364.
Wejchert, Jakub, и David Haumann. 1991. "Аэродинамика Анимации." В Продолжениях 18-ой Ежегодной конференции по вопросам Компьютерной графики и Интерактивных Методик, стр 19–21.

Комментариев нет:

Отправить комментарий