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

Главная

Новости

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

Ссылки

Архив

О нас

Контакты

Форумы


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

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

Web Design:
Neutron


Наш спонсор






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






Океан


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

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

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

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

Продолжение: начало в №№ 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

Окончание следует


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