2. Есть ли жизнь в DirectX`е? Вставим
следующий кусок кода после инициализации графики:
В
этих строках мы создаём наши первые объекты. cam=CreateCamera() –
здесь, мы создаём камеру, (как бы наши «глаза» в виртуальном мире), и
помещаем её в переменную cam (читайте:
называем её cam). cub=CreateCube() –
таким же образом создаём меш – куб, и называем cub. Созданные
нами объекты очутятся в начале координат, т.е. в точке с координатами 0,0,0.
Чтобы камера не была в одной точке с кубом, а смотрела на него со стороны,
нам нужно «поставить» куб в другое место. Для этого можно воспользоваться
командой PositionEntity, которую мы расположим после команды создания куба
PositionEntity cub,0,0,5 - ставит объект
куб в точку с координатами 0,0,5 – т.е. немного впереди. Синтакс:
PositionEntity объект, X координата, Y координата, Z координата А в
цикл программы вставим следующие три строчки:
Эти
команды (точнее последние две) должны присутствовать в вашей программе, если
вы хотите, чтобы она что-то вам показывала. UpdateWorld - Анимирует все объекты в созданном мире,
и проводит проверку на столкновения. RenderWorld - Рендерит все объекты. (Т.е. создаёт
картинку той части мира, которую видит камера(ы)) Flip – Меняет местами передний и
задний буфер. (На этом основан способ двойной буферизации, но это знать не
обязательно – просто нужно вставлять эту команду, для того, чтобы на экране
что-то появлялось) Итак,
теперь запустите программу… что вы видите? Серый квадрат? Практически да,
хотя на самом деле – это куб, просто мы смотрим на него прямо, и видим только
одну грань. Хоть
какой-то прогресс… дальше интересней. Заставим-ка мы его подвигаться! Поставим
эту строчку в цикл. Прямо в самое его начало после команды Repeat…
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) Именно он должен оживить всю сцену. Да
будет свет!
Здесь
всё также, как и раньше! Эту команду можно поставить в любом месте перед
главным циклом, но я обычно создаю свет сразу после создания камеры. Теперь
запустите программу. Так намного лучше, неправда ли? Да,
кстати, свет – это объект, а это значит, что им тоже можно управлять, как и
всеми объектами. Поэтому, чтобы он лучше смотрелся, сразу же после создания
повернём его:
По-моему
так лучше… или у вас есть другие варианты? А
весь код выглядит так:
Ну,
и как вам? Всего 14 строчек сделали то, для чего в других языках пришлось бы
писать несколько страниц! Вот,
в общем первая трёхмерная программа. Не бойтесь экспериментировать –
попробуйте подставить свои значения углов, или назвать объекты по-другому
(тут главное изменить названия переменных во всём коде, а не только в команде
создания). А чтобы убедиться, что вы всё хорошо усвоили, попробуйте сделать
так, чтобы в цикле поворачивался не только куб, но и свет. В
следующем уроке мы научимся управлять объектом сами… |
Оглавление: 0. Введение 5. 2Д в 3Д 7. Родительская зависимость или Привязки 9. Коллизион Детекшн или как устроен мир… 10. Первая 3Д игра. Часть 0 – основы движка 11. Первая 3Д игра. Часть 1 – разработка движка 12. Первая 3Д игра. Часть 2 – устранение багов 13. Первая 3Д игра. Часть 3 – внешний вид 14. Первая 3Д игра. Часть 4 – от массива к спискам 15. Первая 3Д игра. Часть 5 – оптимизация кода 16. Первая 3Д игра. Часть 6 – завершение 17. Выведение |