Основы трехмерной графики в среде Blitz3D


Обработка массива объектов (20 мин)


В предыдущих программах уже создавались множества однотипных объектов, но дальше в программе с ними не происходило никаких изменений. Адрес этих объектов терялся, так как мы, создавая новый объект в цикле, присваивали его адрес одной и той же переменной. Для сохранения этих адресов в памяти воспользуемся массивами.

Напишем программу, которая перемещает в пространстве 100 звезд по разным траекториям. Сначала – заголовок. Здесь создается камера и загружается спрайт:

GRAPHICS3D 640,480

cam = CREATECAMERA()

POSITIONENTITY cam, 0, 0, -20

star = LOADSPRITE("C:\MEDIA\STAR.JPG")

Теперь необходимо разобраться с физической моделью программы. Изначально, 100 звезд размещаются в пространстве случайным образом. Каждая звезда имеет приращения по каждой из координатных осей, которые сначала равняются нулю, но изменяются, в зависимости от положения звезды относительно начала координат. То есть, если какая-либо координата положительна, то приращение уменьшается, если отрицательна – увеличивается. Это приводит к тому, что звезда будет кружиться вокруг начала координат по изогнутой траектории, которую называют кривой Лиссажу.

Создадим три массива. Первый будет содержать адреса спрайтов, второй – их координаты, третий – приращения. Так как координат всего три, а звезд – 100, то второй и третий массивы будут иметь размерность 100 x 3. Звезда n будет иметь адрес addr(n), располагаться в точке с координатами x = c#(n, 1), y = c#(n, 2), z = c#(n, 3) и иметь приращения dx = dc#(n, 1), dy = dc#(n, 2), dz = dc#(n, 3)

DIM addr(100)

DIM c#(100, 3)

DIM dc#(100, 3)

В следующем цикле создается 100 звезд

FOR n



= 1 TO 100

 addr(n) = COPYENTITY(star)

 FOR nn = 1 TO 3

 

Каждая из трех координат приравнивается к случайному значению от –8 до 8.

  C#(n, nn) = RND(-8, 8)

 NEXT

NEXT

Далее следует бесконечный цикл, в котором для каждой из 100 звезд изменяются координаты и приращения, а также происходит визуализация трехмерной сцены:

REPEAT

В двух вложенных циклах к каждой координате каждой звезды прибавляется ее приращение. Затем в зависимости от знака координаты, приращение изменяется (если с#(n, nn) < 0, то SGN(с#(n, nn)) = -1 и приращение увеличивается на 0.005 и наоборот). Затем спрайт звезды помещается в точку, заданную координатами.

 FOR n = 1 TO 100

  FOR nn = 1 TO 3

   c#(n, nn) = c#(n, nn) + dc#(n, nn)

   dc#(n, nn) = dc#(n, nn) - 0.005 * SGN(c#(n, nn))

  NEXT

  POSITIONENTITY addr(n), c#(n,1), c#(n,2), c#(n,3)

 NEXT

 IF KEYDOWN(1) THEN EXIT

 RENDERWORLD

 FLIP

FOREVER



Содержание раздела