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

 

Вставим следующий кусок кода после инициализации графики:

 

cam=CreateCamera()

 

cub=CreateCube()

 

В этих строках мы создаём наши первые объекты.

 

cam=CreateCamera() – здесь, мы создаём камеру, (как бы наши «глаза» в виртуальном мире), и помещаем её в переменную cam (читайте: называем её cam).

 

cub=CreateCube() – таким же образом создаём меш – куб, и называем cub.

Созданные нами объекты очутятся в начале координат, т.е. в точке с координатами 0,0,0. Чтобы камера не была в одной точке с кубом, а смотрела на него со стороны, нам нужно «поставить» куб в другое место. Для этого можно воспользоваться командой PositionEntity, которую мы расположим после команды создания куба

 

PositionEntity cub,0,0,5

 

PositionEntity cub,0,0,5  - ставит объект куб в точку с координатами 0,0,5 – т.е. немного впереди.

Синтакс: PositionEntity объект, X координата, Y координата, Z координата

А в цикл программы вставим следующие три строчки:

 

UpdateWorld

RenderWorld

 

Flip

 

Эти команды (точнее последние две) должны присутствовать в вашей программе, если вы хотите, чтобы она что-то вам показывала.

 

UpdateWorld  - Анимирует все объекты в созданном мире, и проводит проверку на столкновения.

RenderWorld  - Рендерит все объекты. (Т.е. создаёт картинку той части мира, которую видит камера(ы))

Flip – Меняет местами передний и задний буфер. (На этом основан способ двойной буферизации, но это знать не обязательно – просто нужно вставлять эту команду, для того, чтобы на экране что-то появлялось)

 

Итак, теперь запустите программу… что вы видите? Серый квадрат? Практически да, хотя на самом деле – это куб, просто мы смотрим на него прямо, и видим только одну грань.

Хоть какой-то прогресс… дальше интересней. Заставим-ка мы его подвигаться!

Поставим эту строчку в цикл. Прямо в самое его начало после команды Repeat

 

TurnEntity cub,.1,.2,.3

 

TurnEntity cub,.1,.2,.3 – эта функция поворачивает объект cub на 0.1 градус по оси X, 0.2  градуса по оси Y, и 0.3 градуса по оси Z, относительно системы координат объекта… естественно, здесь можно использовать отрицательные числа и ноль. Например команда, TurnEntity cub,0,.1,0 – будет поворачивать куб просто влево, а TurnEntity cub,0,-.1,0 – вправо.

 

Итак, первая «сложность» (хотя в общем ничего сложного здесь нет, это наоборот даже удобно…). Попробую объяснить: помните, я говорил, что оси X, Y и Z (т.е. система координат, если говорить человеческим языком J) есть не только у самой вселенной, но и у каждого объекта. Сделано это для удобства. Главная – «мировая» система координат – статичная, и нужна нам для того, чтобы узнать где, например, находится объект, а система координат объекта – двигается и поворачивается вместе с самим объектом. Например, у нас есть персонаж, который должен поворачиваться и ходить вперёд, допустим, мы его повернули на какой-то угол. И, если мы захотим сделать так, чтобы он шёл в ту сторону, в которую он направлен через «мировую» систему координат, нам придётся делать вычисления, рассчитывающие то, на какой угол он повёрнут, и насколько должен передвинутся относительно каждой оси, но, слава Богу, у него есть собственная система координат, и, где бы он не находился, как бы он не был повёрнут относительно «мировой» системы координат, его Z ось будет указывать направление вперёд-назад (относительно него), Y – вверх-вниз, X – влево-вправо! Иногда нужно наоборот – независимо от того, куда направлен объект, двигать его в какую-то определённую сторону, относительно всего мира. Так, например, действует гравитация – т.е. как бы не был повёрнут объект со своей системой координат, мы просто двигаем его вниз по оси Y по «мировой» системе координат – и он падает!

 

Это было лирическое отступление, чтобы всё было ясно как пень J. Сами команды будут попозже…

 

Итак, когда вы запустите эту программу, вы увидите вращающийся куб. Хм... правда чего-то не хватает?.. Да! Все его грани одинакового  цвета, и мы понимаем, что это именно куб чисто интуитивно. Что же закрашивать каждую грань разными цветами? Нет до этого мы не доросли, да это и не нужно. То, что нам не хватает – это свет! (да, да – это который после тьмы J) Именно он должен оживить всю сцену.

 

Да будет свет!

 

lit=CreateLight()

 

Здесь всё также, как и раньше! Эту команду можно поставить в любом месте перед главным циклом, но я обычно создаю свет сразу после создания камеры. Теперь запустите программу. Так намного лучше, неправда ли?

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

 

TurnEntity lit,45,45,0

 

По-моему так лучше… или у вас есть другие варианты?

 

А весь код выглядит так:

 

Graphics3D 640,480,16,1

SetBuffer BackBuffer()

 

cam=CreateCamera()

lit=CreateLight()

TurnEntity lit, 45,45,0

 

cub=CreateCube()

 

PositionEntity cub,0,0,5

 

Repeat

 

 TurnEntity cub,.1,.2,.3

 

 UpdateWorld

 RenderWorld

 

 Flip

 

Until KeyHit(1)

 

End

 

Ну, и как вам? Всего 14 строчек сделали то, для чего в других языках пришлось бы писать несколько страниц!

Вот, в общем первая трёхмерная программа. Не бойтесь экспериментировать – попробуйте подставить свои значения углов, или назвать объекты по-другому (тут главное изменить названия переменных во всём коде, а не только в команде создания). А чтобы убедиться, что вы всё хорошо усвоили, попробуйте сделать так, чтобы в цикле поворачивался не только куб, но и свет.

           

В следующем уроке мы научимся управлять объектом сами…

 

 

 Оглавление:

 

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