Guest3d.wohlnet.ru
некоммерческий проект, цель которого объединить профессионалов для обмена опытом и знаниями в области real-time рендеринга
guest3d
3.06: Программирование: Математические операторы (Mathematical operators)

В виртуальном мире 3D объекты могут быть перемещены, повернуты или отмасштабированы благодаря применению принципов линейной алгебры. Этот раздел хотя и предназначен для достаточно продвинутых пользователей Quest3D, является ознакомительным. Для дополнительной информации, пожалуйста, обратитесь к большому количеству литературы, написанной по данному предмету.

Матрицы и Движения (Matrix and Motion)
Как описывалось в Разделе 2.1, 3D объекты в Quest3D хранят свою позицию, ориентацию и масштаб в каналах Matrix или Motion. Канал Motion разбит на три вектора (Vector), а каждый вектор разбит на три значения (Values).

Операторы (Operators)
В Quest3D так называемые каналы операторов (Operator) позволяют вам влиять на все эти элементы динамически, в реальном времени.

В качестве основного правила, базовые каналы операторов (Operator) в Quest3D наследуются типом результата. Например, если результатом операции должно быть значение (Value), оператор будет найден в базовом канале Value Operator.

Большинство функций базового канала Value Operator используется для получения информации от других (типов) каналов. Примером часто используемого Value Operator является ‘Get distance (vector, vector)’ (получение значения дистанции из вектора).

Базовый канал Vector Operator также может быть использован для получения информации из других (типов) каналов. Например, ‘Get Translation (position) from Matrix’ (получить перемещение, позицию, из матрицы).

Vector Operator также использоваться для векторной трансформации. Трансформация может включать простое сложение, вычитание, умножение и деление двух векторов. Несомненно, Vector Operator могут быть использованы для задания длины вектора, или умножения вектора на значение или матрицу.

Matrix Operator могут быть использованы для превращения векторов в матрицы, типа ‘Create Translation Matrix’ (создать матрицу перемещения). Matrix Operator также могут хранить информацию, такую, как ‘Get Current Camera Matrix’ (получить текущую матрицу камеры). ‘Matrix Interpolate’ (интеполяция матрицы) может быть использована для смешивания двух матриц.

Специальным типом оператора является ‘Damping’, существующий для значений Values, Vector и Matrices. Он изменяет значение во времени, эффективно 'переливая' его из текущего значения в новое. Эффект логарифмический, и его скорость может быть изменена с помощью второго потомственного входа Value. Скорость этого дампинга ранжируется от ‘0’ до ‘1.0’.

Обратите внимание, что оператор ‘Value Damping’ является отдельным каналом.

Родственные связи (Parenting)
Обычно, движения всех 3D объектов в сцене зависят от центра мировых координат (0, 0, 0). Тем не менее, существует возможность привязать одни объекты к другим. Объект, привязанный к другому объекту, называется потомком, или дочерним объектом. Объект, к которому привязан первый объект, называется родительским.

Привязывание одного объекта к другому в Quest3D выполняется с помощью подключения канала Motion родителя к потомственному входу ‘Parent Matrix’ канала Motion дочернего объекта.

Движение дочернего объекта после этого более не зависит от мировых координат. Вместо этого он зависит от движения своего родительского объекта.

На изображении выше позиция и ориентация светлого куба зависит от мирового центра. На изображении ниже светлый куб привязан к темному. Позиция и ориентация светлого куба зависит от темного.

Посмотреть на (Look At)
Четвертый потомственный вход канала Motion называется ‘Look At Matrix’ (матрица цели взгляда). Объект может быть нацелен в направлении другого объекта с помощью подключения канала Motion цели к ‘Look At Matrix’. Перемещение первого объекта по локальной оси Z будет перемещать его вперед или назад от объекта ‘Look At’.

Примеры включают в себя камеру, следующую за машиной и персонажа бегущего к своей цели.

Реакция Коллизии (Collision Response)
Канал Fast Collision Response (быстрая реакция коллизии) - это система для имитации коллизии между объектами. Она проверяет сфероид в его текущей позиции сравнивая с любым количеством объектов коллизии CollisionObject, и приводит к новой позиции.

Структура канала Fast Collision Response состоит из ряда элементов.

Раздел 4.2 описывает более продвинутую форму решения коллизий, называемую ‘ODE’ (Open Dynamics Engine).

Урок
Следующее упражнение добавляет вращающееся колесо движещемуся автомобилю, демонстрируя концепцию родителя и потомка. Функция матрицы Look At показана с помощью объекта камеры.

Необходимая сцена Quest3D:
..\Tutorials\3.6 – Mathematical operators\Mathematical operators 1.cgr
Необходимые шаблоны:
Variables \ Value \ Expression Value (x2)
Scene \ Render Camera Light

Шаг за шагом:

  • Откройте сцену ‘Mathematical operators 1.cgr’. Она содержит анимированную машину, свободное колесо и модель камеры. Обратите внимание, что свободное колесо расположено в (0, 0, 0).
  • Создайте ярлык канала ‘Car Motion’. Подключите его к потомственному входу ‘Parent Matrix’ канала ‘Front Left Wheel Motion’. Обратите внимание, что объект колеса уже не расположен в (0, 0, 0). Он в той же позиции, что и модель машины.
  • Перейдите в Раздел Анимации.
  • Нажмите на кнопку камеры редактора Editor Camera для просмотра сцены с помощью камеры редактора Quest3D.
  • Нажмите на объект ‘Front Left Wheel’ в списке, чтобы выделить его.
  • Настройте позицию ‘Front Left Wheel’, управляя им с помощью манипуляторов. В качестве альтернативы, вы можете ввести следующие координаты X,Y,Z: (-0.78, 0.32, 1.13).

  • Перейдите в Раздел Каналов.
  • Перетяните Expression Value в Граф Каналов и подключите его к каналу ‘Front Left Wheel Pitch’.
  • Дважды щелкните по Expression Value и введите следующую формулу: ‘OLD - 0.5 * TC’. Нажмите ‘OK’ для подтверждения. Обратите внимание, что объект колеса теперь поворачивается.
  • Создайте три ярлыка Expression Value и подключите их к каналам ‘Front Right Wheel Pitch’, ‘Rear Left Wheel Pitch’ и ‘Rear Right Wheel Pitch’ соответственно. Обратите внимание, что теперь вращаются все четыре колеса.
  • Создайте ярлык ‘Car Motion’. Подключите его к потомственному входу ‘Look At Matrix’ канала ‘Camera Object Motion’. Обратите внимание, что 3D модель камеры теперь направлена на машину.
  • Перейдите в Раздел Анимации.
  • Из выпадающего списка выбора таймеров Timer Selection, выберите таймер ‘Car Animation’. Установите значение таймера на 200 для проигрывания полной анимации.
  • Нажмите кнопку Play. Обратите внимание, что машина начала ездить по дороге. Заметьте, что модель камеры продолжает смотреть на машину.
  • Нажмите кнопку Project Camera. Сцена теперь будет отображаться с позиции Follow Camera.

Законченная сцена:
..\Tutorials\3.6 – Mathematical operators\Mathematical operators 1 – Complete.cgr
Если вы хотите, вы можете сохранить текущую группу каналов в вашу папку проектов. Следующие шаги будут связаны с новой сценой.

Урок2
Необходимая сцена Quest3D:
..\Tutorials\3.6 – Mathematical operators\Mathematical operators 2.cgr
Необходимые шаблоны:
Variables \ Value \ Expression Value (x3)
Logic \ User Input \ User Input (x4)
Variables \ Value \ Value (x2)
Variables \ Vector \ Vector Operator (x2)
Variables \ Matrix \ Matrix Operator
Variables \ Vector \ Vector (using values)

Шаг за шагом:

  • Откройте сцену ‘Mathematical operators 2.cgr’. Она содержит сцену городского блока и растянутый сферический коллизионный объект.
  • Выберите и удалите значение ‘Z’ канала ‘Movement Vector’.
  • Добавьте Expession Value и подключите его к (теперь пустому) третьему потомственному входу канала ‘Movement Vector’.
  • Перетяните два канала User Input в Граф Каналов и подключите их оба к Expression Value. Привяжите к ним клавиши со стрелкой вверх и стрелкой вниз, соответственно. Переименуйте их в ‘Arrow Up’ и ‘Arrow Down’, соответственно.
  • Добавьте канал Value и подключите его к Expression Value. Переименуйте Value в ‘Movement Speed’ (скорость движения). Дважды щелкните по каналу и смените его значение на ‘1’.
  • Дважды щелкните по Expression Value и введите следующую формулу:
    (A – B) * C * (TC / 25)

A - это канал ‘Arrow Up’, B - ‘Arrow Down’, а C - это ‘Movement Speed’. TC - это Tick Count (количество отметок), а фактор ‘25’ подсчитан для 25 кадров в секунду.

  • Переключитесь в Run Mode.
  • Протестируйте сцену на данный момент, нажав клавишу вверх. Обратите внимание, что вид камер перемещается вперед.
  • Нажмите клавишу со стрелкой вниз, чтобы двигаться назад.
  • Подвигайте мышь влево и вправо. Обратите внимание, как это отразилось на обзорном виде.
  • Нажмите клавишу вверх и вместе с этим поводите мышь влево-вправо. Обратите внимание, что вы движетесь вперед и вращаетесь одновременно. Также заметьте, что движение вперед - это не то направление, куда нацелена камера.
  • Переключитесь в Edit Mode.
  • Отключите ‘Movement Vector’ от канала ‘Fast Collision Response’.
  • Добавьте канал Vector Operator и подключите его к каналу ‘Fast Collision Response’. Дважды щелкните по нему и из выпадающего списка выберите ‘Multiply Matrix with Vector (vector, matrix)’ (умножить матрицу на вектор). Закройте окно и переименуйте канал на ‘Adjust Heading’ (регулировка поворотов).
  • Подключите ‘Movement Vector’ к каналу ‘Adjust Heading’.
  • Перетяните канал Matrix Operator в Граф Каналов. Дважды щелкните по нему и из выпадающего списка выберите ‘Get Rotation Matrix from Matrix (matrix)’ (получить матрицу вращения из матрицы). Закройте окно и переименуйте канал в ‘Get Rotation’ (получить вращение).
  • Сделайте ярлык ‘Motion’ и подключите его к каналу ‘Get Rotation’.
  • Подключите канал ‘Adjust Heading’ к каналу ‘Motion’.

  • Переключитесь в Run Mode.
  • Протестируйте сцену на данный момент, нажав на клавишу вверх и клавишу влево одновременно. Обратите внимание, что вид камеры движется вперед и по направлению, в которое указывает камера.
  • Переключитесь в Edit Mode.
  • Смените значение ‘Y’ Value канала ‘Position’ на 2. Обратите внимание, что камера скользит в воздухе. Следующие шаги добавят коллизию и гравитацию модели.
  • Отключите ‘Adjust Heading’ от канала ‘Fast Collision Response’.
  • Добавьте канал Vector Operator. Дважды щелкните по нему и из выпадающего списка выберите ‘Add Two Vectors (vector, vector)’ (добавить два вектора). Закройте окно и переименуйте канал в ‘Add Vectors’.
  • Подключите ‘Adjust Heading’ к каналу ‘Add Vectors’.
  • Подключите канал ‘Add Vectors’ к каналу ‘FastCollisionResponse’.
  • Перетяните шаблон Vector with Values (вектор со значениями) в Граф Каналов и подключите его к каналу ‘Add Vectors’. Переименуйте канал Vector в ‘Gravity Vector’.
  • Выберите и удалите значение ‘Y’ Value канала ‘Gravity Vector’.
  • Добавьте Expression Value и подключите его к (теперь пустому) второму потомственному входу канала ‘Gravity Vector’. Дважды щелкните по нему и введите следующую формулу: -0.4 * TC
Обратите внимание, что камера упала на землю.

  • Повторно протестируйте гравитацию, изменив значение ‘Y’ Value канала ‘Position Vector’ снова на 2. Обратите внимание, что камера снова упала на землю.
  • Протестируйте сцену, походив по ней. Обратите внимание, что камера движется в том направлении, в которое она указывает, и удерживается на земле с помощью гравитации.

Законченная сцена:
..\Tutorials\3.6 – Mathematical operators\Mathematical operators 2 – Complete.cgr

Если у вас есть материалы, или вы хотите дополнить существующие, если вы хотите писать новости относящиеся к технологиям реалтайм рендеринга, или имеете полезные файлы, вы можете стать резидентом guest3d.wohlnet.ru. Для этого нужно написать письмо в свободной форме на den@wohlnet.ru, с указанием вашей мотивации. Кроме того, каждый резидент получает возможность создать свою страницу, ссылка на которую будет прикреплена к каждому опубликованному вами материалу.
вход