|
Aston может рисовать полигональные 3D объекты.
Для активации режима 3D используйте специальный атрибут render="scene3d" в секции paint:
...
<skin name="background">
<paint render="scene3d">
<object3d model="teapot1.3ds"/>
<object3d model="teapot2.3ds"/>
<object3d model="teapot3.3ds"/>
</paint>
</skin>
...
|
Как вы можете видеть в данном примере, секция paint включает секции objet3d в данном случае.
Подробно рассмотрим типичный objet3d:
...
<skin name="background">
<object3d model="pot.3ds">
<material/>
<render_option/>
<camera/>
<transform/>
<light/>
</object3d>
</skin>
...
|
Атрибут model содержит имя файла для объекта в стандартном формате 3DS.
Также, Aston поддерживает встроенный объект model="*QUAD*".
Секция material содержит описание материала объекта:
...
<skin name="background">
<object3d model="pot.3ds">
<material visible_face="cw"
light_mode="none"
diffuse_source="map"
diffuse_color="0xFF007700"
diffuse_image="flower.jpg"
diffuse_uv="vertex"
diffuse_op="replace"
reflection_source="map"
reflection_color="0"
reflection_image="reflection.jpg"
reflection_uv="chrome ball"
reflection_op="add"
/>
<render_option/>
<camera/>
<transform/>
<light/>
</object3d>
</skin>
...
|
Атрибут visible_face задает видимость каждой стороны полигона. Допустимые значения:
- visible_face="cw" - только сторона, которая обходится по часовой стрелке
- visible_face="ccw" - только сторона против часовой стрелки
- visible_face="both" - обе стороны
Атрибут light_mode используется для динамического освещения. Допустимые значения:
- light_mode="none" - нет динамического освещения
- light_mode="flat" - высчитать свет для каждой поверхности
- light_mode="gouround" - линейная интерполяция с каждой вершины (не подерживается в текущей версии Aston)
Теперь рассмотрим группу атрибутов для первого прохода прорисовки материала.
Атрибут diffuse_source задает источник цвета по пикселям в первом проходе прорисовки материала:
- diffuse_source="none" - пропустить данный проход прорисовки материала
- diffuse_source="const" - заполнить все полигоны одним цветом
- diffuse_source="face" - каждый полигон отдельным цветом
- diffuse_source="vertex" - линейная интерполяция между цветами вершин
- diffuse_source="map" - взять с изображения текстуры (в соответствии с текстурными координатами)
Атрибут diffuse_color задает постоянный цвет когда diffuse_source="const"
Атрибут diffuse_image задает имя файла текстуры в случае, когда diffuse_source="map".
Атрибут diffuse_uv задает источник координат текстуры:
- diffuse_uv="vertex" - из информации о вершине, обычно читает из файла 3DS
- diffuse_uv="chrome ball" - высчитывает в процессе координаты текстуры для эффекта хромного отражения
Атрибут diffuse_op подразумевает математическую операцию над пикселями рисуемомго объекта(src) и предыдущими пикселями на экране (dst):
diffuse_op="replace" | dst = src | рисует новые пиксели поверх старых |
diffuse_op="blend" | dst = dst * (1 - alpha) + src * alpha | смешать на значение альфа |
diffuse_op="add" | dst = dst + src | добавление |
diffuse_op="modulate" | dst = dst * src | умножение |
Здесь представлены две группы атрибутов для первого и второго проходов прорисовки материала:
первый проход | второй проход |
diffuse_source | reflection_source |
diffuse_color | reflection_color |
diffuse_image | reflection_image |
diffuse_uv | reflection_uv |
diffuse_op | reflection_op |
Обычно второй проход добавляет эффект отражения.
Поэтому значения по умолчанию (например, если они пропущены в XML):
- diffuse_op="replace"
- diffuse_uv="vertex"
- reflection_op="add"
- reflection_uv="chrome ball"
Рассмотрим секцию render_options. Секция material в этом примере сокращена:
...
<skin name="background">
<object3d model="pot.3ds">
<material/>
<render_option zsort="ranging"
rbuffer_size="20000"
flush_cache="0"
mag_filter="nearest"
z_adjust="best"
/>
<camera/>
<transform/>
<light/>
</object3d>
</skin>
...
|
Атрибут zsort дает возможность соритровки полигонов по глубине (по оси Z):
- zsort="none" - нет сортировки. Это быстро, но может получиться неправильное изображение (например, если цветовая операция "replace" или "blend").
- zsort="ranging" - наиболее быстрое решение, но накладывает ограничения на 3D модели
- zsort="z-buffer" - наиболее точный способ, но медленный с прорисовкой программного обеспечения (не используется в текущей версии Aston).
Атрибут rbuffer_size задает размер буфера ранжирования (используется, когда zsort="ranging").
Сортировка по z-ранжированию может некорректно работать, если это значение меньше общего количества полигонов в сцене.
Атрибут flush_cacheиспользуется для сортировки полигонов нескольких 3D объектов.
Установите flush_cache="0" если object3d не последний в сцене.
Атрибут mag_filter назначает фильтр увеличения тукстуры.
- mag_filter="nearest" - 'nearest neighbour' (ближайший сосед) - быстрый, не точный
- mag_filter="linear" - би-линейная фильтрация, наилучший, но медленный
Атрибут z_adjust дает возможность коррекции перспективы:
- z_adjust="none" - быстрый, но результат прорисовки может быть искажен
- z_adjust="y_only" - корректирует только по оси Y, достаточно быстр
- z_adjust="full" - точен, но медленный
- z_adjust="fast" - наиболее быстрый метод
- z_adjust="best" - наиболее оптимальный метод
- z_adjust="quality" - наиболее точный метод
Следующая секция camera:
...
<skin name="background">
<object3d model="pot.3ds">
<camera fov="1" aspect="1.25"/>
...
...
</object3d>
</skin>
...
|
Атрибут fov задает поле угла зрения. Рекомендуемые значения принадлежат интервалу (0.5 - 2.0).
Атрибут aspect задает отношения ширина/высота для поля зрения 3D-прорисовки.
Например, если сцена ббыла нарисована на обоях с разрешением 1024x768, тогда соотношение размеров будет 1024 / 768 = 1.25
Теперь рассмотрим, как разместить 3D-объект перед виртуальной камерой. Для этого нам нужно трансформировать координаты объекта.
Основные трансформации: передвинуть (move), масштабировать (sceale) и повернуть (rotate). Типичная последовательность трансформаций выглядит так:
...
<skin name="background">
<object3d model="pot.3ds">
...
...
<transform op="scale" x="zoom" y="zoom" z="zoom"/>
<transform op="rotate" x="90"/>
<transform op="rotate" y="alpha"/>
<transform op="move" z="25"/>
</object3d>
</skin>
...
|
В данном примере присутствуют следующие трансформации:
- масштабирование по анимационной переменной "zoom"
- поворот на 90o по оси X
- поворот по анимационной переменной "alpha" по оси Y
- смещение вдоль оси Z на 25 условных единиц (поместить перед виртуальной камерой)
Анимационные переменные используются для интерактивности и анимационных эффектов.
Например, рассмотрим объявление переменной "alpha":
...
<skin name="background">
<anim_vars name="a">
<frame alpha="0"/>
<frame alpha="360"/>
<sequence name="anim_Spawn">
<loop/>
<frame render="0" fps="0.1"/>
<frame render="1" fps="0"/>
</sequence>
</anim_vars>
</skin>
...
|
Это выглядит как объявление анимации для изображений.
Секция anim_vars содержит список кадров и список последовательностей.
Атрибут name="a" должен задавать уникальное имя для каждой секции anim_vars
(это имя - название контекста анимации, а не переменная!)
Каждый frame (кадр) содержит список имен переменных как атрибут с его значениями.
Последовательности, объявленные таким же образом, как и для случая анимации изображения.
Посмотрите на пример этого индикатора для виджета Часы:
...
<skin name="face">
<anim_vars name="1">
<frame a_hour="0"/>
<frame a_hour="720"/>
<indicator name="hour"/>
</anim_vars>
<anim_vars name="2">
<frame a_minute="0"/>
<frame a_minute="360"/>
<indicator name="minute"/>
</anim_vars>
</skin>
...
|
Как вы уже догадались, "a_hour" и "a_minute" могут быть использованы как анимационные переменные для углов поворота стрелок часов.
И наконец, рассмотрим метод задания освещения динамически освещаемых объектов (когда light_mode="flat"):
...
<skin name="background">
<object3d model="pot.3ds">
<material light_mode="flat" diffuse_source="none"/>
<light type="ambient" color="0xFF111111"/>
<light type="directional" dir_x="-1" dir_y="-3" dir_z="3" color="0xFF017eff"/>
<light type="directional" dir_x="1" dir_y="3" dir_z="3" color="0xFF002266"/>
...
...
...
</object3d>
</skin>
...
|
Список источников света объявлен в секциях light.
Атрибут type задает тип света:
- type="ambient" для рассеяного света
- type="directional" для направленного источника освещения
Направление освещения задается через dir_x, dir_y и dir_z (когда type="directional").

| |