Главная
Новости
Статьи и обзоры
Горожанин
Обнинск в Internet
Web Design
Hardware
Software
Безопасность
Серфинг
Игродром
Relax
Технологии
Web-обзор
Интернет-ликбез
Опросник
УП-Технологии
ART.net
Ссылки
Архив
О нас
Контакты
Форумы
Основатель: К.Николаенко
Главный Редактор: С.Коротков
Web Design: Neutron
|
|
= Технологии =
"БЛИЦ" ТРЕХМЕРНОГО МИРА
© Сергей Лосев
Продолжение: начало в №№ 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
Продолжение следует.
|
|