что такое процедурная анимация
Процедурная анимация
Из Википедии — свободной энциклопедии
Процедурная анимация (англ. procedural animation ) — вид компьютерной анимации, который автоматически генерирует анимацию в режиме реального времени согласно установленным правилам, законам и ограничениям. В отличие от предопределённой анимации, когда аниматор вручную определяет каждый кадр и все параметры создаваемой анимации, при процедурной анимации результат может быть в некоторой мере непредсказуем и при каждом запуске может генерировать разнообразную анимацию.
Процедурная анимация используется для создания и моделирования системы частиц (дым, огонь, вода [1] [2] ), ткани и одежды, динамики твёрдых тел, динамики волос и меха, а также для анимации гуманоидных и негуманоидных персонажей.
В компьютерных играх процедурная анимация часто используется для таких простых вещей, как поворачивание головы персонажа, когда игрок озирается по сторонам (например, в игре Quake III Arena).
Физика Ragdoll (рус. физика «тряпичной куклы» ) может считаться видом процедурной анимации. Физика Ragdoll использует физический движок для создания анимации смерти персонажа и его реалистичного падения на поверхность. При использовании физики Ragdoll персонаж состоит из последовательности связанных твёрдых тел (руки, ноги, торс, голова и т. д.), которые запрограммированы с использованием ньютоновой физики, действующей на них. Благодаря физике Ragdoll могут быть созданы очень реалистические анимации, которые очень сложно создать, используя традиционную предопределённую анимацию. Например, с использованием физики Ragdoll тела персонажей могут катиться или скользить по наклонным поверхностям, переворачиваться, кувыркаться и т. д., причём каждый раз анимация будет другой.
Процедурная анимация интенсивно используется в компьютерной игре Spore, в которой созданные игроком существа автоматически анимируются для всех действий, которые должно делать созданное существо: ходьба, бег, плавание, подбирание вещей и т. д.
Ещё одним явным примером процедурной анимации является технология «Dynamic Motion Synthesis» (рус. синтез динамических движений ), которая разработана NaturalMotion и используется в продуктах euphoria и endorphin. «Dynamic Motion Synthesis» (DMS) основан на моделировании биомеханики и моторной нервной системы в режиме реального времени. Также DMS использует элементы из биологии и теории управления роботами. DMS позволяет создавать модели полностью интерактивных трехмерных персонажей, которые не используют заранее просчитанную анимацию. «euphoria» использует DMS для генерации анимации «на лету» в режиме реального времени в компьютерных играх или других интерактивных приложениях. Технология «euphoria» используется в играх Star Wars: The Force Unleashed, Indiana Jones and the Staff of Kings, Max Payne 3, Grand Theft Auto IV и его аддонах, Grand Theft Auto V, а также в симуляторе американского футбола Backbreaker.
Процедурная анимация
Процедурная анимация используется для создания и моделирования системы частиц (дым, огонь, вода), ткани и одежды, динамики твёрдых тел, динамики волос и меха, а также для анимации гуманоидных и негуманоидных персонажей.
В компьютерных играх процедурная анимация часто используется для таких простых вещей, как поворачивание головы персонажа, когда игрок озирается по сторонам (например, в игре Quake III Arena).
Физика Ragdoll (рус. физика «тряпичной куклы») может считаться видом процедурной анимации. Физика Ragdoll использует физический движок для создания анимации смерти персонажа и его реалистичного падения на поверхность. При использовании физики Ragdoll персонаж состоит из последовательности связанных твёрдых тел (руки, ноги, торс, голова и т. д.), которые запрограммированы с использованием ньютоновой физики, действующей на них. Благодаря физике Ragdoll могут быть созданы очень реалистические анимации, которые очень сложно создать, используя традиционную предопределённую анимацию. Например, с использованием физики Ragdoll тела персонажей могут катиться или скользить по наклонным поверхностям, переворачиваться, кувыркаться и т. д., причём каждый раз анимация будет другой.
Процедурная анимация интенсивно используется в компьютерной игре Spore, в которой созданные игроком существа автоматически анимируются для всех действий, которые должно делать созданное существо: ходьба, бег, плавание, подбирание вещей и т. д.
Ещё одним явным примером процедурной анимации является технология «Dynamic Motion Synthesis» (рус. синтез динамических движений), которая разработана NaturalMotion и используется в продуктах euphoria и endorphin. «Dynamic Motion Synthesis» (DMS) основан на моделировании биомеханики и моторной нервной системы в режиме реального времени. Также DMS использует элементы из биологии и теории управления роботами. DMS позволяет создавать модели полностью интерактивных трехмерных персонажей, которые не используют заранее просчитанную анимацию. «euphoria» использует DMS для генерации анимации «на лету» в режиме реального времени в компьютерных играх или других интерактивных приложениях. Технология «euphoria» используется в играх Star Wars: The Force Unleashed, Indiana Jones and the Staff of Kings, Max Payne 3, Grand Theft Auto IV и его аддонах, Grand Theft Auto V, а также в симуляторе американского футбола Backbreaker.
Связанные понятия
Не путать с голосовым движком, который формирует звуковую речь в соответствии с текстом.Звуковой движок (англ. sound/audio engine) — программный компонент игрового движка, отвечающий за воспроизведение звука (шумовое и музыкальное оформление, голосов персонажей) в компьютерной игре или другом приложении. Звуковой движок часто отвечает также за имитацию определённых акустических условий, воспроизведение звука согласно местоположению, эхо и т. д.
Фанатские игры — компьютерные игры, сделанные поклонниками одной или нескольких существующих игр или игровых серий. Многие фан-игры создаются как в качестве попытки клонирования или создания ремейка оригинального дизайна, геймплея и персонажей. Однако в большинстве случаев, фанаты создают уникальную игру, используя вдохновившую игру в качестве прообраза. Хотя качество фан-игр всегда варьировалось, но при текущем уровне развития технологий существует огромное число инструментов, упрощающих создание.
В компьютерных и других играх, движение времени должно управляться тем способом, который игроки считают объективным и простым для понимания. Это обычно делается в одном из двух способов.
В области компьютеризации под аппаратным ускорением понимают применение аппаратного обеспечения для выполнения некоторых функций быстрее по сравнению с выполнением программ процессором общего назначения. Примерами аппаратного ускорения может служить блоковое ускорение выполнения в графическом процессоре и инструкции комплексных операций в микропроцессоре.
Процедурная анимация
Процедурная анимация (англ. procedural animation ) — вид компьютерной анимации, который автоматически генерирует анимацию в режиме реального времени согласно установленным правилам, законам и ограничениям. В отличие от предопределённой анимации, когда аниматор вручную определяет каждый кадр и все параметры создаваемой анимации, при процедурной анимации результат может быть в некоторой мере непредсказуем и при каждом запуске может генерировать разнообразную анимацию.
Процедурная анимация используется для создания и моделирования системы частиц (дым, огонь, вода [1] [2] ), ткани и одежды, динамики твёрдых тел, динамики волос и меха, а также для анимации гуманоидных и негуманоидных персонажей.
В компьютерных играх процедурная анимация часто используется для таких простых вещей, как поворачивание головы персонажа, когда игрок озирается по сторонам (например, в игре Quake III Arena).
Физика Ragdoll (рус. физика «тряпичной куклы» ) может считаться видом процедурной анимации. Физика Ragdoll использует физический движок для создания анимации смерти персонажа и его реалистичного падения на поверхность. При использовании физики Ragdoll персонаж состоит из последовательности связанных твёрдых тел (руки, ноги, торс, голова и т. д.), которые запрограммированы с использованием ньютоновой физики, действующей на них. Благодаря физике Ragdoll могут быть созданы очень реалистические анимации, которые очень сложно создать, используя традиционную предопределённую анимацию. Например, с использованием физики Ragdoll тела персонажей могут катиться или скользить по наклонным поверхностям, переворачиваться, кувыркаться и т. д., причём каждый раз анимация будет другой.
Процедурная анимация интенсивно используется в компьютерной игре Spore, в которой созданные игроком существа автоматически анимируются для всех действий, которые должно делать созданное существо: ходьба, бег, плавание, подбирание вещей и т. д.
Ещё одним явным примером процедурной анимации является технология «Dynamic Motion Synthesis» (рус. синтез динамических движений ), которая разработана NaturalMotion и используется в продуктах euphoria и endorphin. «Dynamic Motion Synthesis» (DMS) основан на моделировании биомеханики и моторной нервной системы в режиме реального времени. Также DMS использует элементы из биологии и теории управления роботами. DMS позволяет создавать модели полностью интерактивных трехмерных персонажей, которые не используют заранее просчитанную анимацию. «euphoria» использует DMS для генерации анимации «на лету» в режиме реального времени в компьютерных играх или других интерактивных приложениях. Технология «euphoria» используется в играх Star Wars: The Force Unleashed, Indiana Jones and the Staff of Kings, Grand Theft Auto IV и его аддонах, а также в симуляторе американского футбола Backbreaker.
OpenSceneGraph: Процедурная анимация геометрии и атрибутов состояния
Введение
Говоря о приемах программирования, специфичных для OSG в прошлый раз мы говорили о механизме обратных вызовов (Callback) и его реализации в движке. Настало время посмотреть на то, какие возможности дает нам применение этого механизма для управления содержимым трехмерной сцены.
Если говорить об анимации объектов, то OSG предоставляет разработчику две возможности её реализации:
1. Процедурная морфинг-анимация
При обходе графа сцены OSG выполняет передачу данных в конвейер OpenGL, который выполняется в отдельном потоке. Этот поток должен быть синхронизирован с другими потоками обработки в каждом кадре. Невыполнение этого требования может привести к тому, что метод frame() завершится раньше обработки данных геометрии. Это приведет к непредсказуемому поведению программы и сбоям. OSG предлагает решение этой проблемы в виде метода setDataVariance() класса osg::Object, являющегося базовым для вех объектов сцены. Можно установить три режима обработки объектов
Общепринятой является практика модификации геометрии «на лету», то есть изменение координат вершин, нормалей цветов и текстур динамически в каждом кадре, получая видоизменяемую геометрию. Такой прием называется морфинг-анимацией. В данном случае решающим является порядок обработки геометрии — все её изменения должны быть пересчитаны до того, как начнется отрисовка. Для иллюстрации этого приема немного изменим пример с цветным квадратом, заставив одну из его вершин вращаться вокруг оси X.
main.h
main.cpp
Создание квадрата вынесем в отдельную функцию
описание которой, в принципе не требуется, так как подобные действия мы проделывали многократно. Для модификации вершин этого квадрата пишем класс DynamicQuadCallback, наследуя его от osg::Drawable::UpdateCallback
переопределяя в нем метод update()
Здесь мы получаем указатель на объект геометрии
читаем из геометрии список вершин (вернее указатель на него)
Для получения последнего элемента (последней вершины) в массиве класс osg::Array предоставляем метод back(). Для выполнения поворота вершины относительно оси X вводим кватернион
то есть мы задали кватернион, реализующий поворот вокруг оси X на угол 0.01 * Pi. Поворачиваем вершину умножением кватерниона на вектор, задающий координаты вершины
Последние два вызова пересчитывают дисплейный список и габаритный параллелепипед для видоизмененной геометрии
В теле функции main() мы создаем квадрат, устанавливаем для него динамический режим отрисовки и добавляем обратный вызов, модифицирующий геометрию
Создание корневого узла и запуск вьювера я оставлю без разбора, так как это мы уже проделывали не менее двадцати раз в разных вариантах. В итоге мы имеем простейшую морфинг-анимацию
А теперь попробуйте убрать (комментировать) вызов setDataVariance(). Возможно мы и не увидим ничего криминального в этом случае — по-умолчанию OSG пытается автоматически определить когда следует обновлять данные о геометрии, пытаясь синхронизироваться с отрисовкой. Тогда попробуйте изменить режим с DYNAMIC на STATIC и будет видно, что изображение рендерится не плавно, с заметными рывками, в консоль сыпятся ошибки и предупреждения типа этого
Если не выполнить метод dirtyDisplayList(), то OpenGL проигнорирует все изменения геометрии и для отрисовки будет использовать дисплейный список, созданный в самом начале, при создании квадрата. Удалите этот вызов, и увидите, что никакой анимации нет.
Без вызова метода dirtyBound() не будет произведен пересчет ограничивающего параллелепипеда и OSG будет неверно выполнять отсечение невидимых граней.
2. Понятие об интерполяции движения
Предположим, что некий поезд, идущий от станции A к станции B затрачивает на это перемещение 15 минут. Как можно смоделировать эту ситуацию, изменяя положение поезда в обратном вызове? Самый простой способ — соотнести положение станции A с моментом времени 0, а станции B — с моментом 15 минут и равномерно перемещать поезд между этими моментами времени. Такой простейший подход называется линейной интерполяцией. При линейной интерполяции вектор, задающий положение промежуточной точки описывается формулой
где p0 — начальная точка; p1 — конечная точка; t — параметр, изменяющийся равномерно от 0 до 1. Однако, движение поезда намного сложнее: выйдя со станции A он разгоняется, потом движется с постоянной скоростью, а затем замедляется, останавливаясь на станции B. Линейная интерполяция такой процесс уже не в состоянии описать и выглядит неестественно.
OSG предоставляет разработчику библиотеку osgAnimation, содержащую ряд стандартный алгоритмов интерполяции, применяемых для плавной анимации перемещения объектов сцены. Каждая из этих функций имеет обычно два аргумента: начальное значение параметра (обычно 0) и конечное значение параметра (обычно 1). Эти функции могут быть применены к начальному участку движения (InMotion), к конечному участку (OutMotion) или к начальному и конечному участку движения (InOutMotion)
Тип движения | in-класс | out-класс | in/out-класс |
---|---|---|---|
Линейная интерполяция | LinearMotion | – | – |
Квадратичная интерполяция | InQuadMotion | OutQuadMotion | InOutQuadMotion |
Кубическая интерполяция | InCubicMotion | OutCubicMotion | InOutCubicMotion |
Интерполяция 4-порядка | InQuartMotion | OutQuartMotion | InOutQuartMotion |
Интерполяция с эффектом отскока | InBounceMotion | OutBounceMotion | InOutBounceMotion |
Интерполяция с упругим отскоком | InElasticMotion | OutElasticMotion | InOutElasticMotion |
Синусоидальная интерполяция | InSineMotion | OutSineMotion | InOutSineMotion |
Интерполяция обратной функцией | InBackMotion | OutBackMotion | InOutBackMotion |
Круговая интерполяция | InCircMotion | OutCircMotion | InOutCircMotion |
Экспоненциальная интерполяция | InExpoMotion | OutExpoMotion | InOutExpoMotion |
Для создания линейной интерполяции движения объекта пишем такой код
3. Анимация узлов трансформации
Анимация движения по траектории — наиболее распространенный вид анимации в графических приложениях. Этот прием может быть использован при анимировании движения автомобиля, полета самолета или движения камеры. Траектория задается предварительно, со всеми положениями, поворотами и изменениями масштаба в ключевые моменты времени. При запуске цикла симуляции состояние объекта пересчитывается в каждом кадре, с применением линейной интерполяции для положения и масштабирования и сферической линейной интерполяции для кватернионов вращения. Для этого используется внутренний метод slerp() класса osg::Quat.
OSG предоставляет класс osg::AnimationPath для описания изменяющейся во времени траектории. Для добавления в траекторию контрольных точек, соответствующих определенным моментам времени используется метод этого класса insert(). Контрольная точка описывается классом osg::AnimationPath::ControlPoint, конструктор которого принимает в качестве параметров позицию, и, опционально, параметры поворота объекта и масштабирование. Например
Здесь t1, t2 — моменты времени в секундах; rot1 — параметр поворота в момент времени t1, описываемый кватернионом osg::Quat.
Возможно управление зацикливанием анимации через метод setLoopMode(). По-умолчанию включен режим LOOP — анимация будет непрерывно повторятся. Другие возможные значения: NO_LOOPING — проигрывание анимации один раз и SWING — циклическое проигрывание движения в прямом и обратном направлениях.
После выполнения всех инициализации мы присоединяем объект osg::AnimationPath к встроенному объекту osg::AnimationPathCallback, являющемуся производным от класса osg::NodeCallback.
4. Пример анимации движения по траектории
Теперь заставим нашу цессну двигаться по окружности с центром в точке (0,0,0). Положение самолета на траектории будет рассчитываться путем линейной интерполяции положения и ориентации между ключевыми кадрами.
main.h
main.cpp
Начинаем с создания траектории самолета, вынося этот код в отдельную функцию
В качестве параметров функция принимает радиус окружности, по которой движется самолет и время, за которое он совершит один оборот. Внутри функции создаем объект траектории и включаем режим циклического повторения анимации
вычисляет параметры аппроксимации траектории. Мы разбиваем всю траекторию на numSamples прямолинейных участков, и вычисляем изменение угла поворота самолета вокруг вертикальной оси (рыскания) delta_yaw и изменение времени delta_time при переходит от участка к учаcтку. Теперь создаем необходимые контрольные точки
В цикле перебираются все участки траектории от первого до последнего. Каждая контрольная точка характеризуется углом рыскания
положением центра масс самолета в пространстве
Поворот самолета на требуемый угол рыскания (относительно вертикальной оси) задаем кватернионом
а затем добавляем рассчитанные параметры в список контрольных точек траектории
В основной программа обращаем внимание на нюанс в указании имени файла модели самолета при загрузке
– к имени файла добавился некий суффикс «.0,0,90.rot». Механизм загрузки геометрии из файла, используемый в OSG позволяет таким образом указать начальное положение и ориентацию модели после загрузки. В данном случае мы хотим, чтобы загрузившись, модель была повернута на 90 градусов вокруг оси Z.
Далее создается корневой узел, являющийся узлом трансформации, и объект модели добавляется к нему в качестве дочернего узла
Теперь создаем обратный вызов анимации траектории, добавляя в него путь, создаваемый функцией createAnimationPath()
Прикрепляем этот callback к узлу трансформации
Инициализация и запуск вьювера производится как обычно
Получаем анимацию движения самолета
Подумайте, вам ничего не показалось странным в этом примере? Ранее, например в программе, когда выполнялся рендеринг в текстуру, вы изменяли матрицу трансформации явно, чтобы добиться изменения положения модели в пространстве. Здесь же мы только создаем узел трансформации и в коде нигде не происходит явного задания матрицы.
Секрет в том, что эту работу выполняет специальный класс osg::AnimationPathCallback. В соответствии с текущим положением объекта на траектории он вычисляет матрицу трансформации и автоматически применяет её к тому узлу трансформации, к которому он прикреплен, избавляя разработчика от кучи рутинных операций.
Тут следует отметить, что прикрепление osg::AnimationPathCallback к другим типам узлов, не только не даст эффекта, но и может привести к неопределенному поведению программы. Важно помнить, что данный обратный вызов воздействует исключительно на узлы трансформации.
5. Программное управление анимацией
Класс osg::AnimationPathCallback предоставляет методы для управления анимацией в процессе выполнения программы
а для начала анимации с четвертой секунды после запуска программы с двухкратным ускорением, такой код
6. Порядок рендеринга примитивов в OpenGL
OpenGL хранит данные вершин и примитивов в различных буферах, таких как буфер цвета (color buffer), буфер глубины (depth buffer), буфер трафарета (stencil buffer) и так далее. Кроме того, он не перезаписывает вершины и треугольные грани уже отправленные в его конвейер. Это означает, что OpenGL создает новую геометрию вне зависимости от того, каким образом создавалась уже существующая геометрия. Это означает, что порядок в котором примитивы посылаются в конвейер рендеринга существенно влияет на конечный результат, который мы видим на экране.
Опираясь на данные буфера глубины OpenGL правильно отрисует непрозрачные объекты, сортируя пиксели по степени их удаленности от наблюдателя. Тем не менее, при использования техники смешивания цветов, например при реализации прозрачных и полупрозрачных объектов, будет выполнятся специальная операция обновления буфера цвета. Новые и старые пиксели изображения смешиваются, с учетом значения альфа-канала (четвертый компонент цвета). Это приводит к тому, что порядок рендеринга полупрозрачных (translucent) и непрозрачных (opaque) граней влияет на конечный результат
на рисунке, в ситуации слева в конвейер были отправлены сначала непрозрачные, а потом прозрачные объекты, что привело к корректному смещению в буфере цвета и корректному отображению граней. В правой ситуации сначала были отрисованы прозрачные объекты, а затем непрозрачные, что привело к неверному отображению.
Метод setRenderingHint() класса osg::StateSet указывает OSG требуемый порядок рендеринга узлов и геометрических объектов, если это необходимо выполнить явно. Этот метод просто указывает, следует или не следует учитывать полупрозрачные грани при рендеринге, тем самым гарантируя, что в случае наличия в сцене полупрозрачных граней сначала будут отрисованы непрозрачные, а затем прозрачные грани, с учетом удаленности граней от наблюдателя. Чтобы сообщать движку, что данный узел непрозрачный используем такой код
или содержит прозрачные грани
7. Пример реализации полупрозрачных объектов
Попробуем проиллюстрировать всё вышеописанное теоретическое введение конкретным примером реализации полупрозрачного объекта.
main.h
main.cpp
В большинстве своем приведенный здесь код не содержит ничего нового: создаются два геометрических объекта — текстурированный квадрат и дельтаплан, модель которого загружается из файла. Однако, ко всем вершинам квадрата мы применяем белый полупрозрачный цвет
– значение альфа-канала равно 0.5, что в смешении с цветами текстуры должно дать эффект полупрозрачного объекта. Кроме того, для обработки прозрачности следует задать функцию смешивания цветов
передав её машине состояний OpenGL
При компиляции и запуске этой программы мы получим следующий результат
Стоп! А где же прозрачность? Всё дело в том, что мы забыли указать движку, что следует обрабатывать прозрачные грани, что решается легко вызовом
после чего мы получим нужный нам результат – крыло дельтаплана просвечивается через полупрозрачный текстурированный квадрат
Параметры функции смешивания GL_SRC_ALPHA и GL_ONE_MINUS_SRC_ALPHA означают, что результирующий пиксель экрана при отрисовке полупрозрачной грани будет иметь компоненты цвета, рассчитываемые по формуле
где [srcR, srcG, srcB] — компоненты цвета текстуры квадрата; [dstR, dstG, dstB] — компоненты цвета каждого пикселя того участка на который накладывается полупрозрачная грань, полученные с учетом того, что на этом месте уже отрисован фон и непрозрачные грани крыла дельтаплана. Под srcA понимаю альфа-компоненту цвета квадрата.
Метод seRenderingHint() отлично упорядочивает отрисовку примитивов, но использовать его не слишком эффективно, так как сортировка прозрачных объектов по глубине при рендеринге кадра довольно ресурсоемкая операция. Поэтому разработчик должен позаботится о порядке отрисовки граней самостоятельно, если это возможно на предварительных этапах подготовки сцены.
8. Анимация атрибутов состояния
С помощью анимации можно управлять и атрибутами состояний. Целый рад визуальных эффектов может быть сгенерирован путем изменения свойств одного или нескольких атрибутов рендеринга. Подобную анимацию, изменяющую состояние атрибутов рендеринга легко реализовать через механизм обратных вызовов при обновлении сцены.
Классы стандартных интерполяций так же мотут быть использованы для задания функции изменения параметров атрибутов.
У нас уже имеется опыт создания полупрозрачных объектов. Мы знаем, что если альфа-компонента цвета равна нулю, мы получаем полностью прозрачный объект, при значении 1 — полностью непрозрачный. Ясно, что варьируя этот параметр от 0 до 1 во времени можно получить эффект постепенного появления или исчезания объекта. Проиллюстрируем это на конкретном примере
main.h
main.cpp
Начинаем с создания обратного вызова-обработчика изменения значения альфа-канала во времени
Защищенный параметр _motion будет определять ту функцию, по которой будет изменятся значение альфы во времени. Для данного примера выберем аппроксимацию кубическим сплайном, задавая её сразу же, в конструкторе класса
Эта зависимость может быть проиллюстрирована вот такой кривой
В конструкторе объекта InOutCubicMotion определяем пределы изменения аппроксимируемой величины от 0 до 1. Далее переопределяем operator() для данного класса таким образом
Получаем указатель на материал
В callback приходит абстрактное значение атрибута, однако мы прикрепим данный обработчик к материалу, поэтому придет именно указатель на материал, поэтому мы смело преобразуем атрибут состояния к указателю на материал. Далее мы задаем интервал времени обновления аппроксимирующей функции — чем он больше, тем быстрее будет происходить изменение параметра в пределах заданного диапазона
Читаем значение аппроксимирующей функции
и присваиваем материалу новое значение диффузного цвета
Теперь сформируем сцену в функции main(). Я думаю вы уже устали каждый раз строить квадрат по вершинам, поэтому упростим задачу — генерируем квадратный полигон стандартной функцией OSG
В качестве первого параметра выступает точка, от которой будет строится левый нижний угол квадрата, два других параметра задают координаты диагоналей. Разобравшись с квадратом, создаем для него материал
Мы указываем параметры цвета материала. Ambient color — это параметр, характеризующий цвет материала в затененной области, недоступной для источников цвета. Diffuse color — собственный цвет материала, характеризующий способность поверхности рассеивать падающий на неё цвет, то есть то, что мы привыкли называть цветом в быту. Параметр FRONT_AND_BACK указывает, что данный атрибут цвета присваивается как лицевой, так и обратной стороне граней геометрии.
Назначаем материалу созданный нами ранее обработчик
Назначаем созданный материал квадрату
и задаем другие атрибуты — функцию смешивания цветов и указываем, что данный объект имеет прозрачные грани
Завершаем формирование сцены и запускаем вьювер
Получаем результат в виде плавно появляющегося в сцене квадрата
Вместо заключения: небольшая ремарка о зависимостях
Наверняка ваш пример не компилируется, выдавая ошибку на этапе компоновки. Это не случайно – обратите внимание на строчку в заголовочном файле main.h
Каталог заголовков OSG, из которого берется заголовочный файл, обычно указывает на ту библиотеку, в которой содержится реализация функций и классов, описанных в заголовке. Поэтому появление каталога osgAnimation/ должно наводить на мысль о том, что в список линковки сценария сборки проекта следует добавить одноименную библиотеку, примерно так (с учетом путей к библиотекам и версии сборки)