Главная
Новости
Статьи и обзоры
Горожанин
Обнинск в Internet
Web Design
Hardware
Software
Безопасность
Серфинг
Игродром
Relax
Технологии
Web-обзор
Интернет-ликбез
Опросник
УП-Технологии
ART.net
Ссылки
Архив
О нас
Контакты
Форумы
Основатель: К.Николаенко
Главный Редактор: С.Коротков
Web Design: Neutron
|
|
= Технологии =
"БЛИЦ" ТРЕХМЕРНОГО МИРА
© Сергей Лосев
Продолжение: начало в №№ 9(157), 10(158), 11(159), 12(160)
3D-ГЕОМЕТРИЯ В ДЕТАЛЯХ
Теперь о более сложных средствах Blitz Basic. Объекты масштабируются, перемещаются. Если траектории движения рассчитываются по специальным формулам, то совершенно необязательно тратить ресурсы ПК на аналогичные вычисления и для вспомогательных объектов, чтобы, к примеру, получать сведения об их положении по отношению друг к другу. Blitz Basic предоставляет функции для преобразования локальных координат объекта в общемировые. Скажем, если куб был перемещен и масштабирован (для чистоты эксперимента в следующем примере он деформируется случайным образом), то можно всегда узнать т.н. мировые координаты для точки 0,0,1 куба. Именно этим и занимается команда TFormPoint, в аргументах которой указываются координаты, объект и в качестве последнего число 0, соответствующее мировым координатам, - она заполняет значения полей TFormedX, TFormedY, TFormedZ. Кроме TFormPoint существует также команда TFormVector, позволяющая узнать координаты объекта при перемещении по MoveEntity, и аналогичная ей, но с нормализацией вектора, - TFormNormal.
Graphics3D 640, 480
cube = CreateCube ( )
MoveEntity cube, Rand (3), Rand (3), Rand (3)
ScaleEntity cube, Rand (10), Rand (10), Rand (10)
TFormPoint 0, 0, 1, cube, 0
message$ = "TFORM : x=" + TFormedX ( ) + ", y="
+ TFormedY ( ) + ", z=" + TFormedZ ( )
Text 180, 200, message$
Flip
WaitKey ( )
End
Множество объектов в сцене, к примеру, деревья на открытых пространствах или предметы интерьера в помещениях, затрудняют движение, ведь нужно учитывать не только его
направление, но и всевозможные препятствия, которые могут появиться на пути. В таких случаях в игровых движках используется обработка коллизий (столкновений) - специальный инструмент, позволяющий фиксировать момент "наложения" двух объектов. Доступен он и в Blitz Basic. Сначала указывается тип объектов (числовое значение), затем радиус взаимодействия и наконец включается режим коллизий, а также указываются дополнительные параметры: способ столкновения (числовое значение: 1 - сфера-сфера, 2 - сфера-полигон, 3 - сфера-куб) и действие (1 останов, 2 и 3 - скольжение):
Const tscene=1
Const tactor=2
EntityType object1, tscene
EntityType object2, tactor
EntityRadius object1, 2
Collisions tactor, tscene
Собственно говоря, в простых играх этого кода вполне достаточно, однако Blitz Basic предоставляет вспомогательные средства для получения служебных сведений: координаты точки, интервал времени, номер поверхности столкновения и т.д.
Не менее интересная возможность Blitz Basic - это управление вершинами (вертексами), треугольниками (они образуются из трех предварительно заданных вершин) и поверхностями. Средствами Blitz Basic можно нарисовать на экране объект любой сложности, для чего достаточно представить его в виде т.н. опорных точек, из которых впоследствии можно составить треугольники. Таким образом, можно создавать отсутствующие в этом языке программирования объекты нестандартной формы. Скажем, такие, как в следующем примере (в первом Data-блоке перечень координат вертексов, во втором - тройки чисел, которые определяют геометрию объекта).
Dim v (6), t (8)
Data 6, 0, 0, 0, 0, 0, 1 1, 0, 1 1, 0, 0 0, 1, 0
0, 1, 1
obj=CreateMesh ( )
surf=CreateSurface (obj)
Read vertexcount
For i=0 To vertexcount-1
Read x#, y#, z#
v (i)=AddVertex (surf, x#, y#, z#)
Next
Data 8, 0, 3, 2 0, 2, 1 0, 4, 3 1, 2, 5 0, 1, 5
0, 5, 4 2, 4, 5 2, 3, 4
Read trianglecount
For i=0 To trianglecount-1
Read v0, v1, v2
t (i)=AddTriangle (surf, v(v0), v(v1), v(v2))
Next
Вершины (вертексы) позволяют и деформировать объекты. Определив координаты вертекса, в котором нажата кнопка мыши, (все эти действия выполняются с помощью встроенных функций Blitz Basic, таких, как CameraPick, PickedSurface, PickedTriangle), можно, скажем, "нарастить" объект или изменить цвет его фрагмента. Следующий пример вполне послужит заготовкой для подобной программы - он получает координаты вершин треугольника, с которым затем можно делать все что угодно.
Ent=CameraPick (cam, MouseX ( ), MouseY ( ))
If ent<>0 Then
Surf=PickedSurface ( )
Tria=PickedTriangle ( )
If MouseDown (1) Then
v0=TriangleVertex (surf, tria, 0)
v1=TriangleVertex (surf, tria, 1)
v2=TriangleVertex (surf, tria, 2)
; координаты вершины v0
x0=VertexX (surf, v0)
y0=VertexY (surf, v0)
z0=VertexZ (surf, v0)
…
End If
Окончание следует
|
|