6. Трёхмерный курсор.

 

В этот раз я покажу, как можно управлять объектом с помощью мышки.

 

Итак, берём шаблон:

 

Graphics3D 640,480,16,1

SetBuffer BackBuffer()

 

cam=CreateCamera()

PositionEntity cam,0,5,0

 

lit=CreateLight()

 

cur=CreateSphere(8)

EntityColor cur,255,215,0

PositionEntity cur,0,0,10

 

pln=CreatePlane()

tex=LoadTexture("Picture.bmp")

ScaleTexture tex,10,10

EntityTexture pln,tex

 

Repeat

 

 

 

 UpdateWorld

 RenderWorld

 

 Flip

 

Until KeyHit(1)

 

End

 

Здесь мы создаём всё, что нам нужно, расставляем и создаём цикл. Новые команды: CreateSphere(количество сегментов) – Создаёт сферу (а то чего мы всё куб да куб J) в скобках указываем количество сегментов – 8 = 224 полигона, 16 = 960 полигонов и 32 = 3968 полигонов. Естественно, чем больше полигонов, тем «круглее» наш шарик, и тем больше памяти он занимает. EntityColor объект, красный, зелёный, синий – Эта команда закрашивает данный объект цветом RGB, где указывается сколько должно быть красного, зелёного, синего цвета, значения которых могут быть от 0 до 255. Вот, например, 0,0,0 – чёрный цвет, 255,255,255 – белый, 0,255,0 – самый зелёный J

 

Теперь насчёт мышки. Хотя курсор и не показывается на экране, на самом деле он есть – то есть он двигается, если вы двигаете мышку, остаётся только определить на сколько. Просто поставьте эти команды в начале цикла:

 

mx=MouseXSpeed()

my=MouseYSpeed()

MoveMouse 320,240

 

Так, что эта вся хрень значит? Поясняю. MouseXSpeed() – это функция, которая говорит нам об изменении X координаты мышки на экране, с момента последнего вызова этой функции. Ну короче, на сколько пикселей её в последний раз передвинули (По X)! MouseYSpeed() – тоже самое, но по Y (Есть ещё MouseZSpeed() – это передвижение колёсика). MoveMouse x,y – устанавливает курсор мышки в данную точку (это делается для того, чтобы он не подходил к краю, и мы всегда могли бы узнать передвижение мышки… короче надо… J).

 

Итак, мы знаем, на сколько у нас передвигается мышка с каждым кадром, осталось только передвигать сферу, в зависимости от передвижения мышки (данные о передвижении находятся у нас в переменных mx и my):

 

MoveEntity cur,mx,0,-my

 

Теперь можно запускать программу… да не трогайте вы клавиатуру – теперь кубик можно передвигать мышкой! Правда кубик какой-то гиперактивный… нужно сбавить ему скорость – просто заменим эту строчку на:

 

MoveEntity cur,mx*.1,0,-my*.1

 

Так будет намного удобнее! Всё – у нас есть трёхмерный курсор!

Но мы на этом не остановимся!!! Мы пойдём дальше! Сделаем так, чтобы камеру можно было вертеть:

 

If KeyDown(203) TurnEntity cam,0,2,0

If KeyDown(205) TurnEntity cam,0,-2,0

 

Если вы теперь запустите программу, то обратите внимание, что когда камера повёрнута нормально (как стоит в начале) – то всё как бы нормально – двигаешь мышку влево, сфера двигается влево, двигаешь вперёд – и сфера двигается вперёд… но стоит нам повернуться на 90 градусов влево, как становится совсем неудобно: передвигаешь мышку влево – курсор уходит вперёд, передвигаешь мышку вперёд – курсор уходит вправо! А если повернуться на 180 градусов – то всё вообще становится наоборот. Почему же происходит такое неправильное движение? Вообще-то движение-то правильное – оно как было, так и осталось – просто мы теперь смотрим на это под другим углом. Что же теперь камеру не вертеть что ли? Конечно нет! Настоящие программеры не сдаются! (…они просто ленятся… J) Значит будем думать вместе… хм… это… э-э-э…а может?… хотя нет…э… дА! Есть идея! Смотрите: Сфера всегда повёрнута прямо. Когда камера повёрнута прямо, получается так, что их оси совпадают по направлению, а когда камера повёрнута налево, то получается что её ось X совпадает с осью Z сферы. Ну в общем такая фи гня… короче, надо сделать так, чтобы их оси совпадали, говоря человеческим языком – чтобы они направлены были в одну сторону! Но как это сделать?

…………………………………………J

Очень просто!

Так:

 

ex=EntityPitch#(cam)

ey=EntityYaw#(cam)

ez=EntityRoll#(cam)

RotateEntity cur,ex,ey,ez

 

…или так (результат один и тот же):

 

RotateEntity cur,EntityPitch#(cam),EntityYaw#(cam),EntityRoll#(cam)

 

Итак новые командосы J:

EntityPitch#(объект) – функция, возвращающая угол наклона данного объекта относительно оси X мировой системы координат

EntityYaw#(объект) - -//- по оси Y

EntityRoll#(объект) - -//- по оси Z

RotateEntity объект, X,Y,Z – В общем похожа на команду TurnEntity (тем, что она объект поворачивает), вот только делает она это относительно мировой системы координат, а не системы координат объекта.

 

А теперь у нас есть курсор, которому позавидует любой программер (программирующий в 2Д J)!

 

 

 Оглавление:

 

0.  Введение

1.  В начале была Тьма

2.  Есть ли жизнь в DirectX

3.  Свобода и Власть 3Д (0)

4.  Свобода и Власть 3Д (1)

5.  2Д в 3Д

6.  Трёхмерный курсор

7.  Родительская зависимость или Привязки

8.  Фишки с привязками

9.  Коллизион Детекшн или как устроен мир…

10.     Первая 3Д игра. Часть 0 – основы движка

11.     Первая 3Д игра. Часть 1 – разработка движка

12.     Первая 3Д игра. Часть 2 – устранение багов

13.     Первая 3Д игра. Часть 3 – внешний вид

14.     Первая 3Д игра. Часть 4 – от массива к спискам

15.     Первая 3Д игра. Часть 5 – оптимизация кода

16.     Первая 3Д игра. Часть 6 – завершение

17.     Выведение

 

 

 

 

Используются технологии uCoz