Еженедельник Свет в Интернет

Главная

Новости

Статьи и обзоры
  Горожанин
  Обнинск в Internet
  Web Design
  Hardware
  Software
  Безопасность
  Серфинг
  Игродром
  Relax
  Технологии
  Web-обзор
  Интернет-ликбез
  Опросник
  УП-Технологии
  ART.net

Ссылки

Архив

О нас

Контакты

Форумы


Основатель:
К.Николаенко

Главный Редактор:
С.Коротков

Web Design:
Neutron


Наш спонсор






Порт POPULAR.RU
POPULAR.RU RegionalBanner Network.






Океан


НПП Метра - промышленные электронные автомобильные вагонные весы
Goldy Interior - салон офисной мебели: кабинеты руководителей, мебель для персонала

= Технологии =

"БЛИЦ" ТРЕХМЕРНОГО МИРА

© Сергей Лосев

Продолжение: начало в №№ 9(157), 10(158)

ЛУЧ СВЕТА ИЗ КАМЕРЫ

Очень важными элементами 3D-сцен являются … камеры и освещение. Они, собственно, говоря, определяют, что и как увидит зритель на экране. Как правило, перед тем как использовать какие-либо другие 3D-средства Blitz Basic, нужно вызвать функцию CreateCamera( ):camera=CreateCamera( ) .
Как правило, этого достаточно, чтобы на экране выводились попавшие в "объектив" объекты, хотя камеру все-таки нужно "приподнять" над остальными объектами - по умолчанию она тоже появляется в точке с координатами 0,0,0. Кроме того, для камеры задаются т.н. границы видимости. При этом все, что попадает в этот диапазон, отображается на экране, а в остальном игнорируется. Масштаб сцены, на которую "смотрит" камера, указывается в команде CameraZoom (например, Camera zoom camera, 2 - двукратное увеличение). А эффект тумана для скрытия "лишних" объектов - в CameraFogColor (цвет тумана), CameraFogRange (команда, аналогичная, но действующая лишь когда туман "включен") и CameraFogMode (включение/ выключение тумана).
Функции для освещения сцены практически аналогичны: создание функцией CreateLight, позиционирование PositionEntity и вращение RotateEntity. Итак, простейшая программа, в которой используются и камеры, и свет, выглядит следующим образом (дополнительно выводится объект plane):

Graphics3D 640, 480
SetBuffer BackBuffer ( )
Camera=CreateCamera ( )
PositionEntity camera, 0 , 1, 0
Light=CreateLight ( )
RotateEntity light, 90, 0, 0

Plane=CreatePlane ( )
Groundtexture=LoadTexture ("ground.bmp")
EntityTexture plane, groundtexture

crange=10
CameraRange camera, 1, crange
While Not KeyDown ( 1 )
If KeyDown (205)=True Then TurnEntity camera,
0, -1, 0
If KeyDown (203)=True Then TurnEntity camera,
0, 1, 0
If KeyDown (208)=True Then MoveEntity camera,
0, 0, -0.05
If KeyDown (200)=True Then MoveEntity camera,
0, 0, 0.05
RenderWorld
Flip
Wend
Endv

При освещении сцены в команде CreateLight можно указывать аргумент - он определяет форму источника света. Их три: свет направлен в определенном направлении (directional light), точечный источник света (point light) и освещение в виде "пятна" (spot light), радиус которого задается оператором LightConeAngles. Отличие между этими типами источников света наглядно иллюстрируется в демонстрационном примере из DirectX SDK 9.0; Blitz Basic тоже использует API DirectX (седьмой версии).
В самом начале этой статьи упоминалось об оптимизации при рендеринге сложных сцен. Действительно, совершенно необязательно выводить на экран те объекты, которые находятся за пределами экрана. В Blitz Basic тоже есть подобные функции, реализуемые, как всегда, предельно просто, с помощью всего нескольких функций. Прежде всего, преобразуем 3D-координаты в экранные функцией CameraProject ( ), а затем вызываем функцию EntityInView, которая возвращает значение True, если объект виден.

CameraProject (camera, EntityX (cube), EntityY (cube),
EntityZ (cube))
RenderWorld
If EntityInView (cube, camera)
; координаты области CameraProject
; ProjectedX# ( ), ProjectedY# ( ), ProjectedZ# ( )
EndIf

Продолжение следует.


Copyright © Свет в Internet   Designed by Свет в Internet