Blitz3d - спрайты, поверхности

Проволочный каркас

В Blitz3D существует режим отображения, который называется "проволочный каркас". В нем изображаются только контуры элементарных фигур - треугольников. Этот режим включается командой

WIREFRAME 1

Попробуйте посмотреть в этом режиме последнюю созданную программу.
Фото
Этот режим наглядно демонстрирует структуру объектов.

Спрайты

Спрайт - это двумерный рисунок в трехмерном пространстве. Классический спрайт всегда повернут в сторону камеры и меняет размеры в зависимости от расстояния до нее. Любой точечный рисунок можно сделать спрайтом:

a = LOADSPRITE(файл)

Спрайт масштабируется с помощью специальной команды:

SCALESPRITE спрайт, SX, SY

Программа "Звездное небо"

Эта программа похожа на программу создания леса.
Изменим программу с роботом (эти строки нужно добавить после строк текстурирования). Загружаем спрайт:

star = LOADSPRITE("C:\media\star.jpg")

Увеличиваем его размеры в 3 раза:

SCALESPRITE star, 3, 3

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

FOR x = 1 TO 100
	star2 = COPYENTITY(star)
	POSITIONENTITY star2, RND(-120, 120), RND(20, 50), RND(1, 240)
NEXT

Фото

Трехмерная поверхность

Трехмерную поверхность можно представить, как листок бумаги в клетку, у которого мы можем задавать высоты точек, лежащих на пересечении линий. Еще, представьте клетчатую сетку, в каждое пересечение брусьев которой впаян штырек. Штыри имеют разные высоты, и если мы накинем на них ткань, то она будет лежать на них некоторой поверхностью.
Фото

Создается поверхность с помощью команды:

a = CREATETERRAIN(размер [,род])

Параметр «размер» определяет, на сколько клеток делится поверхность по длине и ширине. Он, так же, как и размер текстуры, должен быть степенью двойки. Высоту определенной точки поверхности задает команда:

MODIFYTERRAIN поверхность, x, z, высота

x и z должны лежать в пределах от 0 до размера поверхности - они определяют точку поверхности. Высота должна лежать в интервале [0, 1]. А вот эта команда включает затенение поверхности:

TERRAINSHADING поверхность, 1

Программа, выводящая на экран поверхность воды с рябью

Сделаем заголовок программы:

GRAPHICS3D 640, 480

cam = CREATECAMERA()
POSITIONENTITY cam, 64, 64, -16
ROTATEENTITY cam, 45, 0, 0
l = CREATELIGHT()
ROTATEENTITY l, 0, 45, 45

Создадим поверхность:

t = CREATETERRAIN(64)

Включим затенение поверхности:

TERRAINSHADING t, 1

Загрузим текстуру воды и увеличим ее размер в 16 раз, затем привяжем текстуру к поверхности.

water = LOADTEXTURE("C:\media\water.jpg")
SCALETEXTURE water, 16, 16
ENTITYTEXTURE t, water

Увеличим размеры поверхности (особенно высоту):

SCALEENTITY t, 2, 20, 2

Создадим бесконечный цикл:

REPEAT

Здесь,  в этих циклах будут задаваться высоты  для каждой  из точек поверхности:
 FOR x = 0 TO 64
  FOR z = 0 TO 64

Вкратце можно описать формулу,  по которой задаются точки так: синус расстояния  от средней точки поверхности до данной плюс приращение умножается  на расстояние.
   r# = SQR((x - 32) * (x-32) + (z - 32) * (z - 32)) / 16
   MODIFYTERRAIN t, x, z, SIN(r# * 360 + k) / 2 / (r# + 1) + .5
  NEXT
 NEXT

Добавим команды  для визуализации, приращение переменной, условие выхода  и закроем цикл:
 RENDERWORLD
 FLIP

 k = k - 5
 IF KEYDOWN(1) THEN EXIT
FOREVER

Фото

Создание холмистой поверхности

Эта программа показывает последовательное сглаживание поверхности, заданной случайным образом. Создадим заголовок, где будет создана камера, свет и текстурированная поверхность:

GRAPHICS3D 640, 480

cam = CREATECAMERA()
POSITIONENTITY cam, 64, 64, -16
ROTATEENTITY cam, 45, 0, 0
l = CREATELIGHT()
ROTATEENTITY l, 0, 45, 45

t = CREATETERRAIN(64)
TERRAINSHADING t, 1
grass = LOADTEXTURE( "C:\media\grass.jpg" )
SCALETEXTURE grass, 32, 32
ENTITYTEXTURE t, grass
SCALEENTITY t, 2, 60, 2

Делаем цикл  из 10 шагов:
FOR n = 1 TO 10

Циклы  по всем точкам поверхности:
 FOR x = 0 TO 64
  FOR z = 0 TO 64

На первом этапе- задаем высоты точек случайным образом:
   IF n=1 THEN
    MODIFYTERRAIN t, x, z, RND(0, 1)
   Else

На следующих этапах устанавливаем  для каждой точки значение высоты, равное среднему арифметическому между значениями высоты ее  и соседних:
    MODIFYTERRAIN t, x, z, (TERRAINHEIGHT(t, x - 1, z) + TERRAINHEIGHT(t, x, z - 1) + TERRAINHEIGHT(t, x, z) + TERRAINHEIGHT(t, x + 1, z) + TERRAINHEIGHT(t, x, z + 1)) / 5
   END IF
  NEXT
 NEXT

Визуализируем сцену, ждем нажатия клавиши  и закрываем цикл:
 RENDERWORLD
 FLIP
 WAITKEY
NEXT

Фото