Blitz3d уроки - 2. Свет, камера, объекты

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

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 строчек сделали то, для чего в других языках пришлось бы писать несколько страниц!

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

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