3D для Mobile Basic [часть 2]

от
GameDev

В продолжение к первой части статьи "3D для Mobile Basic"

Речь здесь пойдёт о "шутерском повороте" или вращении вокруг оси "Y", какое частое встречается в мобильных 3Д игрушках.

screen.png
Если мы предполагаем вращение точек вокруг оси "Y" - следовательно саму координату "y" мы не трогаем. Изменяются только координаты "x" и "z" в плоскости 'x-z'.

Чтобы осуществить поворот точек вокруг оси "Y" на нужный нам градус, используем параметрическую запись уравнения окружности:


X = x0 + R * COS(alf)
Y = y0 + R * SIN(alf)

В нашем случае вместо координаты "Y" будет координата "Z".
R - радиус;
alf - угол текущего расположения точки;
(x0; z0) - центр окружности, или точка, вокруг которой будет происходить вращение.

Итак, допустим, мы хотим повернуть точку (x=-20; z=50) вокруг центра окружности/точки (x0=10; z0=-20) на угол 45 градусов. В расчетах желательно градусы сразу перевести в радианы, умножив на (пи/180). Т.е. мы будем поворачивать на 45 * (пи/180) = 0.7854 радиан.

Прежде, чем повернуть точку на угол alf = alf + 0.7854, нам нужно найти сам угол 'alf' - текущий угол расположения точки.

Возьмём любую запись из параметрического уравнения окружности, например:


X = x0 + R * COS(alf)

'X' и 'x0' нам известны. R - это длина прямой, соединяющая центр окружности и нашу точку, которую будем поворачивать. Т.е. 'R' будет рассчитываться следующим образом:


R = SQR ( ((x0-X)^2) + ((z0-Z)^2) )

Напомню, что функция 'SQR' в Mobile Basic и в Basic вообще - корень квадратный.

Теперь нам известны 'R', 'X', 'x0'. Выражаем угол 'alf':


alf = ACOS( (X - x0) / R )

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


R = SQR ( ((x0-X)^2) + ((z0-Z)^2) )
alf = ACOS( (X - x0) / R )
alf = alf + угол
X = x0 + R*COS(alf)
Z = z0 + R*SIN(alf)
------------------------------------------
R = SQR ( ((10-(-20))^2) + ((-20-50)^2) ) = 76,16
alf = ACOS( (-20 - 10) / 76,16 ) = 1,9757
alf = 1,9757 + 0,7854 = 2,7611
X = 10 + 76,16*COS(2,7611) = -60,713
Z = -20 + 76,16*SIN(2,7611) = 8,284

На этом с вращениями - всё!

Практическая часть (движок)

В движке я забил 7 закрашенных граней, реализовал также освещенность грани по дальности, вращение, передвижение и ранжирование граней. Поскольку исходник вышел довольно большим для статьи, я просто вам даю ссылку на него.

Сам код (*.lis) вы можете скачать здесь: Autorun.lis

О том, как забивать данные граней, показано на рисунке 1. Позиционирование осей [x-y-z] относительно экрана вы можете посмотреть в первой части статьи "3D для Mobile Basic".

x-z.png Рисунок 1. Заполнение данных граней.
Теперь о настройке движка. Как вы уже заметили, в коде есть пункт "НАСТРОЙКА ПАРАМЕТРОВ 3D ENGINE".

  1. REM НАСТРОЙКА ПАРАМЕТРОВ 3D ENGINE
  2. 1000 qualitet_map=36
  3. 1001 H_RECT_MAX=96
  4. 1002 Z_LIGHT=500
  5. 1003 Z3D_DREAM=-100
  6. 1004 X2D_LEFT_DREAM=50
  7. 1005 X2D_RIGHT_DREAM=190
  8. 1006 X_PERS_OS=0
  9. 1007 Z_PERS_OS=-100
  10. 1008 w_os=screenwidth(0)/2
  11. 1009 h_os=screenheight(0)/2
  12. 1010 ZOOM_X2D=0.3
  13. 1011 ZOOM_Y2D=0.3
  14. 1012 UGOL_A=0.174533
  15. 1013 Z3D_HOD=20
  16. 1014 RANG_GRAN=1

Имеется пока всего 15 параметров:


1) qualitet_map - отвечает за качество закрашивания граней. Чем параметр больше, тем качество лучше.
2) H_RECT_MAX - смотрите рисунок 2.
3) Z_LIGHT -----|
4) Z3D_DREAM -|=> смотрите рисунок 3.
5) X2D_LEFT_DREAM ---|
6) X2D_RIGHT_DREAM -|=> смотрите рисунок 2.
7) X_PERS_OS -|
8) Z_PERS_OS -|=> центр окружности или точка вокруг которой осуществляется поворот (начало статьи), смотрите рисунок 4.
9) w_os --|
10) h_os -|=> координаты центра экрана.
11) ZOOM_X2D -|
12) ZOOM_Y2D -|=> зрительное увеличение/уменьшение 2Д отображения.
13) UGOL_A - угловой шаг поворота.
14) Z3D_HOD - шаг передвижения по карте.
15) RANG_GRAN - включить ранжирование граней - если 1; выключить - если 0.

option.png Рисунок 2.
z-parametrs.png Рисунок 3.
X-Z_OS.png Рисунок 4.
У меня на мобилке вполне с нормальной скоростью идёт. Правда большие карты будут подтормаживать, поэтому для обычных мобильных разве что пошаговую ходилку, наподобие DOOM RPG 3D, можно реализовать. Если же собирать большие карты под андроид на MB IDE, то там можно хоть полноценный 3Д шутер с разными эффектами писать и всё будет норм.

Напоследок выкладываю:
Сборка кода в формате (*.jar): 3D_POVOROT.jar
  • +17
  • views 5645