Guest3d.ru
некоммерческий проект, цель которого объединить профессионалов для обмена опытом и знаниями в области real-time рендеринга
guest3d
3.03: Программирование: Цикл For Loop

Продвинутые интерактивные сцены реального времени могут состоять из сотен элементов. Будучи неэффективно настроенными, такие сцены могут предъявлять слишком высокие требования к графическим картам. Также, управление проектом может выходить из-под контроля. Без правильной структуры, управление таким большим количеством элементов может быть непосильной задачей.

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

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

Цикл For Loop
Как и многие другие языки программирования, Quest3D использует так называемую функцию ‘For Loop’. Цикл For Loop запускает определенную часть программы необходимое количество раз в каждом кадре. Только когда все ‘повторения’ цикла For Loop будут запущены, програма перейдет к следующей части.

На изображении выше, сначала обрабатывается ‘Part 1’. Далее, 10 раз запускается ‘Part 2’ с помощью функции For Loop. Наконец, программа переходит к ‘Part 3’.

Имитация вождения может потребовать пятьдесят автомобилей в сцене. Вместо того, чтобы иметь пятьдесят отдельных объектов авто, использование For Loop позволяет вам создать единичный объект машины и визуализировать его пятьдесят раз, с отличиями в позиции, форме, цвете и даже управлении.

Обновления в кадре (Updates per frame)
Обычно Quest3D обновляет канал единожды за кадр. Это вызвано причинами производительности и безопасности. Каналы в цикле For Loop должны быть обновлены несколько раз в кадре. Настройки обновления (update) для таких каналов должны быть выставлены на ‘Continuous’ (непрерывное). Опция непрерывного обновления (‘Continuous’) расположена в каждом канале, в окне основных свойств ‘General Properties’.

Каналы, заданные как повторяющиеся (‘Continuous’), могут быть отличены по соответствующему значку.

Потомок ‘Max Iterations’ канала For Loop определяет общее количество запусков подпрограммы. Значение ‘Current Iteration’ (Value) может быть использовано для создания вариаций для различных клонов (instances) в цикле ForLoop. Простым примером может быть варьирование X координаты для клонов объекта (instance).

Выражения (Expressions)
Также может быть использована зависимость между значениями ‘Current Iteration’ и ‘Max Iterations’. На изображении ниже, Expression Value ‘(A+1) / B’ приводит к градиенту от ‘0.2’ до ‘1.0’.

Визуализация сцен (Rendering)
Хорошей практикой является задействование как можно меньшего количества каналов для цикла For Loop. Вместо множественного вызова Render вместе с Camera и Light в каждом кадре, лучше включить в цикл только сами объекты.

На изображении выше, Camera и Light вызываются только раз перед циклом For Loop. Объекты вызываются множество раз, с вариациями на основе значения ‘Current Iteration’ Value. Наконец, Light вызывается еще раз для выключения, таким образом он не влияет на другие визуализаторы (renders).

Рисование природы против циклов For Loops (Nature painting versus For Loops)
Как обсуждалось в Разделе 2.9, рисование природы Nature Painting также разработано для визуализации большого количества 3D объектов в сцене. Nature Painting просчитывается очень быстро благодаря оптимицизации использования аппаратных средств, но конкретно предназначается для статичных элементов. Динамические объекты должны всегда визуализироваться с помощью For Loop.

Урок
Этот урок использует структуру For Loop для визуализации ряда автомобилей на экране.

Необходимые шаблоны:
Scene \ Start 3D Scene
Logic \ Channel Caller
Scene \ Cameras \ Object Inspection Camera
Scene \ Light \ Point Light
Logic \ For Loop
Variables \ Value \ Expression Value (x2)

Шаг за шагом:

  • Начините новый проект.
  • Перетяните Start 3D Scene в Граф Каналов. Нажмите правой клавишей мыши на этом канале ‘Start 3D Scene’ и выберите ‘Set as start channel’.
  • Добавьте Channel Caller и переименуйте его в ‘Scene’. Подключите его к каналу ‘Start 3D Scene’.
  • Перетяните шаблон Object Inspection Camera в Граф Каналов и подключите к каналу ‘Scene’.
  • Закройте окно Animation 3D View, нажав на закладку групп ‘Groups’.
  • Добавьте шаблон Point Light и подключите его к каналу ‘Scene’.
  • Перетяните шаблон ForLoop в Граф Каналов и подключите его к каналу ‘Scene’.
  • Смените значение канала ‘Max Iterations’ на ‘5’.
  • Импортируйте файл Car.x из папки Resource\3D Models\Cars. Выберите все каналы из новой импортированной группы (объект car), скопируйте и вставьте их в группу с For Loop.
  • Создайте ярлык канала Point Light и подключите его к каналу ‘Scene’. Теперь свет будет отключен после визуализации каждого кадра, таким образом он не будет влиять на другие визуализаторы.

  • Перейдите в закладку ‘Animation 3D View’, чтобы изучить текущее положение дел. Обратите внимание, что только одна машина видима.
  • Удалите канал ‘X, R or Value’ вектора позиции ‘Position’.
  • Перетяните Expression Value в шаблон и подключите его к первому (свободному) потомственному входу канала ‘Position’.
  • Создайте ярлык для канала ‘Current Iteration’ и подключите его к каналу ‘Expression Value’.
  • Дважды щелкните по каналу ‘Expression Value’ и введите формулу, ‘A * 3’. Выберите опцию ‘Rename Channel to formula’ и нажмите ‘OK’ для подтверждения.
  • Нажмите правой клавишей мыши на канале ‘A * 3’ и выберите основные настройки ‘General Properties’. В окне настроек выберите опцию ‘Continuous’ (непрерывный). Теперь этот канал будет обновляться множество раз в течение кадра. Нажмите ‘OK’ для подтверждения.
  • Также установите каналы ‘Position’, ‘Motion’ и ‘Car’ на непрерывное обновление ‘Continuous’. Обратите внимание, что все эти каналы должны быть обновлены для каждого клона (instance) в цикле For Loop. Обратите внимание, что после выставления каналов на ‘Continuous’, в Animation 3D View появится пять автомобилей.
  • Переключитесь в Run Mode.
  • Облетите машины и изучите их.
  • Когда будет готово, переключитесь в Edit Mode.
  • Из поверхности машины ‘Car 1’ удалите значение ‘R’ вектора ‘Emissive’. Если у вас нет вектора эмиссии Emsissive, добавьте его из шаблонов.
  • Добавьте Expression Value и переименуйте его в ‘Gradient’. Подключите его к первому (свободному) потомственному входу канала ‘Emissive’. Обратите внимание, что цвета автомобилей изменятся.
  • Создайте ярлык канала ‘Current Iteration’ и подключите его к каналу ‘Gradient’.
  • Создайте ярлык для канала ‘Max Iterations’ и подключите его ко второму потомственному входу канала ‘Gradient’.
  • Установите каналам ‘Gradient’, ‘Emissive’ и ‘Material’ непрерывное обновление ‘Continuous’.
  • Дважды щелкните на канале ‘Gradient’ и введите формулу, ‘(A+1) / B’.

Нажмите ‘OK’ для подтверждения. Обратите внимание, что цвета машин изменились от голубого до светло-серого.

Законченная сцена:
..\Tutorials\3.2 – Advanced logic\Advanced logic – Complete.cgr

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