Блог Александра Божко
Архивы
Рубрики
Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Как и обещал, продолжаю повествование о FireMonkey.

Сегодня несколько слов об освещении 3D сцены и об окраске поверхностей 3D объектов. Не смотря на кажущуюся простоту, тема довольно  интересная.

Представьте себе обычную комнату, с мебелью и другими предметами интерьера, в которой полностью отсутствует освещение. Теперь давайте создадим новую 3D форму, поместим в ней несколько 3D объектов и… покрасим ее в черный цвет. Примерно так:

self.Color:= TAlphaColors.Null;

Фактически, таким образом,  мы получим модель идеальной темной комнаты. В которой, как справедливо заметил Конфуций, очень трудно искать черную кошку. В роли кошек, в нашем случае выступают 3D фигуры. Ни одной фигуры на форме, как вы понимаете, не видно. Вот с этого места, на мой взгляд, и следует рассказывать об освещении и свойстве 3D объектов FireMonkey - Material.

property Material: TMaterial read FMaterial write SetMaterial;

Класс TMaterial среди прочих свойств имеет несколько свойств типа TAlphaColor.

Начнем со свойства Emissive.

property Emissive: TAlphaColor

Это собственый цвет объекта, не зависящий от внешнего освещения. Давайте в нашей темной комнате выберем одну из фигур и присвоим свойству Material.Emissive какое-нибудь отличное от нуля значение.

Например, так:

Cylinder1.Material.Emissive:= TAlphaColors.Aqua;

Вы сразу же увидите объект с измененным свойством. Но, его поверхность будет плоской. В природе у объектов такого свойства нет. Ближайшая аналогия – некая светящаяся поверхность, свет от которой настолько слаб, что практически не освещает другие объекты.

FireMonkeyEmissiveColor

А теперь давайте включим свет. Сделать это очень просто. Разместим на форме компонент TLight.

Ключевым свойством этого компонента является свойство LightType, определяющее тип освещения. Оно может принимать три значения – ltDirectional, ltPoint и ltSpot. По умолчанию используется направленное (Directional) освещение. Точечное (Point) освещение имитирует светящуюся точку, свет от которой распространяется во все стороны. И, наконец, прожектор (Spot) освещает некоторый участок поверхности, на который он направлен. Если вы хотите равномерно осветить всю сцену, то пожалуй, лучше всего использовать направленнное освещение. Ближайший аналог из реальной жизни – дневной свет. Точечное освещение напоминает электрическую лампочку без абажюра. Spot освещение, как и следует из названия, имитирует свет прожектора.

FireMonkeyTLightltDirectional

Запускаем приложение, и видим, что невидимые в темноте фиггуры стали видимыми, и  все они приобрели объем.

Именно тут и проявляют себя остальные три “цветовых” свойства.

Для того, что бы задать цвет поверхности, при освещении используется свойство Ambient. Оно определяет базовый цвет освещенной поверхности и активируется при появлении любого источника света.

Свойство Diffuse определяет цвет рассеивания. Здесь учитывается угол падения света на поверхность. Обычно значение этого свойства устанавливается таким же, как и у свойства Ambient.

Specular используется для имитации глянцевой поверхности, и определяет цвет отблеска. По умолчанию этот цвет выставляется белым, чтобы не изменять отраженный свет. Откровенно говоря, у меня не получилось эффективно задействовать это свойство.

Кроме того, для поверхности объекта можно задать текстуру. Любопытно, что при этом поддерживается “прозрачность” *.gif изображений. Пример использования такой прозрачности я приводил ранее.

Текстурированая поверхность 3D объектов так же поддерживает эффекты освещения.

Таким образом, используя FireMonkey мы можем полностью имитировать реальный мир с источниками света. С другой стороны. мы можем создавать упрощенные примитивы, в которых объекты имеют “собственный цвет”. Конечно, первый вариант более реалистичен, но и более трудоемок в реализации.

В следующий части данного цикла я планирую рассмотреть движение объектов.

Другие статьи серии:

Firemonkey на практике #0
Firemonkey на практике #1
Firemonkey на практике #2. Движение 3D объектов
Firemonkey на практике #3. Использование 3D моделей
Firemonkey на практике #4. Ты попал!
Firemonkey на практике #5.


Поделись с другими!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

5 комментариев: Firemonkey на практике #2. Освещение и материал поверхности 3D объектов

  • Александр, ты сам материал собрал или брал что-то в качестве основы? Интересен момент текстуризации объектов. В 3D пакетах есть возможность за счет текстур реализовать геометрию объекта (например, Bump в 3D MAX) или его материал (стекло, пластмасса, металл и др.). Понятно, что в FMX такого сразу не будет (да и наверно далеко не сразу что-то появится), но должен быть выход на собственную реализацию (я не уверен, но мне кажется такое делается при помощи шейдеров).

  • Как бы разжиться программой, которая позволяет в рантайме самому ColorBox-ом это плавно менять? а?
    :)

Ответить на Всеволод Леонов Отмена ответа

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика