Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! 154) Программирование 3D-игр: Базовые понятия на практике


Школа программирования

154) Программирование 3D-игр: Базовые понятия на практике

Последний выпуск по программированию 3D-игр был N 151.

Базовые понятия на практике

С основными сущностями и принципами построения "плоской", двумерной программы в Blitz3D мы познакомились. Теперь перейдем к созданию первой трехмерной программы. Для этого воспользуемся одним из стандартных примеров Blitz3D.

Введите следующий текст программы в Blitz3D и нажмите клавишу F5, чтобы его исполнить:

  Graphics3D 800,600

    SetBuffer BackBuffer()

    camera=CreateCamera()
    CameraViewport camera,0,0,800,600

    light=CreateLight()

    cube=CreateCube()
    PositionEntity cube,0,0,5

    while not KeyHit(1)

        TurnEntity cube,0.1,0.2,0.3

        UpdateWorld
        RenderWorld

        Flip

    Wend
    end

В ней демонстрируются почти все базовые сущности системы - камера, свет, примитивный трехмерный объект, вращение, вывод текста в 3D-режиме. Рассмотрим их по порядку.

Первые две команды нам уже знакомы. Первоначально задается графическое разрешение программы - 800*600, а затем формируется фоновый буфер.

Команда

camera=CreateCamera()

создает сущность-камеру с помощью функции CreateCamera(). Идентификатор этой камеры заносится в переменную camera, которую, в соответствии с, возможно, не самыми лучшими принципами Бейсика, заранее можно не объявлять.

Таких камер в программе можно создавать произвольное число, а затем переключаться между ними, реализуя известные эффекты обзора спереди, сбоку, с разных фиксированных точек и т. д.

Команда

CameraViewport camera,0,0,800,600

задает так называемый порт обзора камеры. Во многих программах применяется множественный вывод разных изображений в разных частях экрана. Например, в верхней части показывается вид из самолета, в нижней - изображение местности внизу, а сбоку внизу - радарная схема.

Для деления экрана на разные зоны вывода графики, предназначена команда CameraViewport.

Первый ее параметр - переменная-идентификатор камеры, четыре следующие - координаты левого верхнего угла порта на экране и его ширина и высота.

Схожим с камерой образом создается и источник света. Для этого применяется функция CreateLight():

light=CreateLight()

Как уже говорилось, по умолчанию в B3D существует окружающий свет, и функция CreateLight() без дополнительных параметров просто его дублирует. Тем не менее желательно придерживаться данного шаблона построения программы, в дальнейшем модифицируя его под задачу.

Затем функцией CreateCube() создается реальный объект нашего трехмерного мира - куб:

cube=CreateCube()

Идентификатор куба записывается в переменную cube.

После того, как куб создан (каждая его грань имеет по умолчанию длину в одну единицу), его надо расположить в некоторой точке пространства. Также можно создавать такие базовые трехмерные фигуры, как сфера, цилиндр и конус.

Трехмерное позиционирование любой сущности в B3D выполняется командой PositionEntity:

PositionEntity cube,0,0,5

Сущность, заданная первым параметром, устанавливается в точке пространства с координатами x,y,z.

Здесь полезно поэкспериментировать с координатами установки, в том числе и отрицательными значениями, чтобы понять, какая из них за какое направление отвечает.

В главном цикле отображения интерес вызывает команда

TurnEntity cube,0.1,0.2,0.3

Она поворачивает объект, заданный первым параметром, на углы (в радианах) по каждой из трех осей, заданные следующими параметрами. Напомню, что ось x соответствует движению вперед/назад, ось y - движению вправо/влево, ось z - вращению вправо/влево.

Вращать можно в принципе большинство сущностей B3D. Так, вращению можно подвергнуть камеру, источники направленного света и т. д.

Важно! Данную команду TurnEntity необходимо вызывать постоянно - внутри главного цикла, так как она выполняет разовое смещение на некоторый угол. Эффект непрерывности вращения будет достигнут, когда эта команда будет выполняться на каждом кадре при формировании сцены.

Две команды

UpdateWorld
RenderWorld

почти всегда используются вместе.

UpdateWorld автоматически выполняет анимацию (пересчитывает координаты) всех трехмерных объектов (в нашем случае - вращение куба), и проверяет, не произошло ли столкновений между ними (в нашем случае кубу пока не с кем сталкиваться).

RenderWorld рисует на текущем выбранном экранном буфере всю трехмерную сцену.

Наконец, уже знакомая Flip выводит содержимое фонового буфера на экран.

Группа UpdateWorld, RenderWorld и Flip также должна выполняться постоянно, внутри главного цикла, при формировании каждого кадра сцены.

Задания.

а) Создайте в этой программе вторую камеру и выводите изображения от каждой из них в разных частях экрана.

б) Добавьте для второй камеры ее вращение - чтобы изображение во втором подокне вращалось также, как будто вращается и сама камера. Для этого воспользуйтесь командой TurnEntity применительно ко второй камере.


(c) 2004-2007 Сергей Бобровский bobrovsky as russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса всегда тут:
http://www.infiltration.ru/p/

Неофициальный сайт поддержки (со срочными вопросами - сюда):
www.prog-begin.net.ru.


Мои учебные курсы "Технологии Delphi / C++ / C#. Разработка приложений для бизнеса".
http://shop.piter.com/display.phtml?a_id=17681&web_ok=all

Все эти учебные курсы рассчитаны не только на разработчиков, но и на всех тех, кто хочет стать ИТ-менеджером. Для этого как минимум нужно иметь общее представление о современных технологиях разработки и их истории и владеть соответствующей терминологией.
В книгах описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив один учебный курс, вы существенно сэкономите :) В книгах полностью описаны:
- Delphi (версия 2006, полностью совместимая с Turbo Delphi) для обеих платформ - Win32 и .NET;
- C# (новый язык Microsoft, на котором базируется платформа .NET и все новые версии Windows);
- C++ для платформы Win32.
Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книги.

Мои книги, которые пока доступны в продаже:


Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное