Главная страница
Навигация по странице:

  • Цикл событий

  • Трехмерные проекции

  • Уравнение 1.1. Ортогональная проекция

  • Уравнение 1.2. Аксонометрическая проекция

  • Звездное поле

  • Лазерные пушки и обнаружение попаданий

  • Введениев программированиетрехмерных игрВ этой части


    Скачать 0.7 Mb.
    НазваниеВведениев программированиетрехмерных игрВ этой части
    Дата04.02.2018
    Размер0.7 Mb.
    Формат файлаpdf
    Имя файлаpart.pdf
    ТипРеферат
    #35779
    страница4 из 4
    1   2   3   4
    73
    Конечно же, заголовочные файлы
    T3DLIB1.H, T3DLIB2.H, T3DLIB3.H должны быть в рабочем каталоге компилятора. И наконец, необходимо быть абсолютно уверенным, что вы включили в проект
    .LIB файлы DirectX вместе с .CPP файлами или включили их в список связывания. Вам необходимы лишь следующие
    .LIB файлы DirectX: DDRAW.LIB,
    DSOUND.LIB, DINPUT.LIB, Вы можете назвать
    .EXE файл как угодно — возможно, TEST.EXE или RAIDERS3D_TEST.EXE однако не идите дальше, пока вы не сможете его скомпилировать.
    Цикл событий
    Главная точка входа для всех программ Windows — функция
    WinMain(), точно так же,
    как main() — главная точка входа для программ DOS/UNIX. В любом случае создает окно для Raiders3D и затем входит прямо в цикл событий.
    WinMain() начинает с создания и регистрации класса Windows. Затем создается окно игры, после чего производится вызов функции
    Game_Init(), которая выполняет инициализацию игры. После завершения инициализации выполняется вход в стандартный цикл событий Windows, который считывает сообщения. Если сообщение найдено, вызывается процедура Windows
    WinProc, которая обрабатывает его. В противном случае вызывается функция игры. Именно здесь происходит реальное действие игры.
    Читатели предыдущей книги могут заметить, что в разделе инициализации функции) появился дополнительный код для обработки оконной графики и изменения размера окна. Эта возможность, а также поддержка 16 битового цвета являются частью новой версии игрового процессора
    T3DLIB. Тем не менее, большая часть кода в этой книге по прежнему поддерживает 8 битовую графику, поскольку в общем случае скорость 16 битовых программ все еще слишком мала.
    При желании вы можете войти в бесконечный цикли никогда больше не возвращаться в основной цикл событий
    WinMain(), но это было бы плохо, поскольку в этом случае Windows не будет получать сообщения. Нам нужно рассчитать и вывести один кадр анимации, а затем вернуться в
    WinMain(). При этом Windows продолжит работу и будет обрабатывать сообщения. Этот процесс показан на рис. Внутренняя логика игры
    После выполнения блока игровой логики в функции
    Game_Main() производится визуализация изображения во внеэкранную рабочую область (двойной буфер, или на жаргоне задний буфер (back buffer)). Завершающим этапом является вывод изображения на экран в конце цикла с помощью вызова
    DDraw_Flip(), что создает иллюзию анимации. Игровой цикл состоит из стандартных разделов, определенных ранее в элементах двумерных или трехмерных игр. Теперь я хочу сосредоточиться на 3D графике.
    Логика искусственного интеллекта врага очень проста. Вражеский корабль создается в случайной точке трехмерного пространства на расстоянии, превышающем видимость. Рисунок показывает пространство вселенной Raiders3D. Как видно из рисунка, камера или наблюдатель расположены в точке на отрицательной оси z с координатами (0,0,-zd), где -zd расстояние от наблюдателя до виртуального окна, куда проецируется изображение. Здесь используется левая система координат (положительная ось z направлена в экран).
    После того как вражеский корабль создан, он следует по заданному вектору траектории, пересекающей поле зрения игрока, те. он идет более или менее встречным курсом.
    Вектор и начальное положение корабля генерируются функцией
    Init_Tie(). Вашей целью как игрока является прицелиться во врага и выстрелить.
    НА ЗАМЕТКУ
    ЧАСТЬ
    I. ВВЕДЕНИЕ В
    ПРОГРАММИРОВАНИЕ ТРЕХМЕРНЫХ ИГР
    WinMain()
    {
    }
    CreateWindow()
    Обработка сообщений
    GameInit()
    Главный цикл событий
    Game_shutdown()
    {
    __
    __
    __
    __
    __
    }
    Вызывается в конце
    Game_shutdown()
    Game_main()
    Game_main()
    {
    __
    __
    __
    __
    }
    Вызывается для каждого кадра
    Game_Init()
    {
    __
    __
    __
    __
    }
    Вызывается один разв начале
    WinProc()
    {
    __
    __
    __
    }
    Ввод
    Физика
    Искусственный интеллект



    Визуализация
    Рис. 1.17. Схема системы обработки сообщений
    Итак, как же генерируется трехмерная картинка Вражеские корабли — это нечто иное, как многоугольные объекты (совокупность линий, которые образуют контур объекта) — те. они скорее двумерные, а не полностью трехмерные. Ключевым моментом трехмерности является перспектива. На рис. 1.19 показана разница между ортогональной и аксонометрической проекцией. Это два основных типа проекций, используемых в системах трехмерной графики.
    +y
    –y
    +x
    –x
    –z
    +z
    Дальняя плоскость отсечения
    Плоскость обзора
    × 480
    (0, 0, –zd)
    Камера
    Рис. 1.18. Вселенная Raiders3D
    ГЛАВА
    1. ОСНОВЫ ПРОГРАММИРОВАНИЯ ТРЕХМЕРНЫХ ИГР
    75
    P
    2
    P
    1
    P
    1
    '
    P
    2
    '
    P
    1
    P
    1
    '
    Точка проекции
    Плоскость проекции
    Проецирующие лучи
    Проецирующие лучи а. Аксонометрическая проекция б. Ортогональная проекция
    P
    2
    P
    2
    '
    Рис. 1.19. Аксонометрическая и ортогональная аксонометрическая проекции
    Трехмерные проекции
    Ортогональная проекция хорошо подходит для технических чертежей и изображений,
    где аксонометрическое искажение нежелательно. Математика ортогональной проекции очень проста — по сути, происходит простое изменение координаты z каждой точки в соответствии со следующим уравнением.
    Уравнение 1.1. Ортогональная проекция
    Для точки с координатами
    (
    )
    x, y, z ortho ortho x
    x,
    y Аксонометрическая проекция немного сложнее, и на данном этапе я не хочу слишком вдаваться в ее объяснение. В целом, для получения двумерной проекции на экране с координатами нам необходимо учитывать координату z, а также расстояние от наблюдателя. Математика аксонометрической проекции показана на рис. 1.20. Она основана на вычислении координат подобных треугольников.
    Уравнение 1.2. Аксонометрическая проекция
    Для точки с координатами
    (
    )
    x, y, z с расстоянием до наблюдателя zd per per zd x x
    ,
    z zd y С помощью такого простого уравнения объекты, состоящие из многоугольников, в трехмерном пространстве можно перемещать также, как и двумерные объекты. Применяя к объектам аксонометрическое преобразование до выполнения визуализации, мы достигаем корректный вид и перемещение в трехмерном пространстве. Конечно, здесь есть несколько своих тонкостей, но сейчас они неважны. Все, что нужно знать, — это то, что трех
    ЧАСТЬ
    I. ВВЕДЕНИЕ В
    ПРОГРАММИРОВАНИЕ ТРЕХМЕРНЫХ ИГР
    мерные объекты проецируются на двумерное поле зрения (экран) по законам аксонометрической проекции, y
    1
    , Проецируемая точка+ z
    +x (левая система координат+ Используя подобие треугольников,
    можно записать = zd
    ∆B
    ∆A
    zd z
    =
    Y_per zd Рис. 1.20. Аксонометрическое преобразование, 4)
    P
    1
    (–4, 0)
    P
    2
    (–4, –4)
    P
    3
    (–1, 0)
    P
    4
    (0, 2)
    P
    5
    (1, 0)
    P
    6
    (0, –2)
    P
    7
    (4, 4)
    P
    8
    (4, 0)
    P
    9
    (4, Список вершин P
    0
    … P
    9
    P
    2
    (–4, 4)
    (–4, Ребро Ребро Ребро Ребро Ребро Ребро Ребро Ребро Список ребер
    Рис. 1.21. Каркасная модель боевого корабля
    Итак, мы преобразуем каждый вражеский корабль с помощью аксонометрической проекции и выполняем его визуализацию на экран. Рис. 1.21 показывает каркасную мо
    ГЛАВА
    1. ОСНОВЫ ПРОГРАММИРОВАНИЯ ТРЕХМЕРНЫХ ИГР
    77
    дель вражеского корабля, которая используется в качестве основы для визуализации.
    Таблица положений каждого корабля хранится в следующем массиве struct TIE_TYP
    {
    int state; //
    : 0=
    , 1=
    float x, y, z; // float xv,yv,zv; //
    } TIE, Когда приходит время рисовать вражеские корабли, используются данные в виде структуры
    TIE и мы получаем более менее реалистичное трехмерное изображение движущегося объекта.
    Вы также заметите, что корабли по мере приближения становятся ярче. Этот эффект легко реализовать. Главный принцип состоит в том, что ось z используется в качестве масштабирующего коэффициента при изменении яркости корабля.
    Звездное поле
    Звездное поле — это нечто иное, как совокупность одиночных точек, генерируемых некоторым источником в пространстве. Кроме того, после ухода из поля зрения игрока они появляются заново. Точки подвергаются визуализации как полноценные объекты в соответствии с перспективным преобразованием. Однако их размер — 1
    ×1×1
    пиксель, поэтому это настоящие точки и всегда выглядят как одиночные пиксели.
    Лазерные пушки и обнаружение попаданий
    Лазерные пушки, из которых стреляет игрок, — это нечто иное, как двумерные линии, выходящие из углов экрана и сходящиеся на перекрестии прицела. Обнаружение попаданий выполняется путем наблюдения за двумерными проекциями кораблей на поле зрения и проверкой того, попадают ли лазерные лучи в ограничивающий прямоугольник каждой проекции. Это процесс схематически показан на рисунке Этот алгоритм работает, поскольку лазерные лучи распространяются со скоростью света. Не имеет значения, находится ли цельна расстоянии 10 метров или 10 000 километров если вы прицеливаетесь и лазерный луч пересекает проекцию трехмерного объекта, произойдет попадание.
    Взрывы
    Взрывы в этой игре очень впечатляют размером кода. При попадании лазерного луча в корабль, линии, образующие 3D модель корабля, копируются во вторичную структуру данных. Затем линии беспорядочно расходятся в трехмерном пространстве, что напоминает обломки корабля. Движение линий происходит несколько секунд, после чего взрыв прекращается. Эффект очень реалистичен и реализован меньше чем 100 строками кода.
    Как играть в Чтобы запустить игру — просто сделайте щелчок мышью на файле
    RAIDERS3D.EXE на компакт диске, и программа тотчас запустится. Клавиши управления
    ЧАСТЬ
    I. ВВЕДЕНИЕ В
    ПРОГРАММИРОВАНИЕ ТРЕХМЕРНЫХ ИГР
    • клавиши управления курсором — перемещение перекрестия прицела;
    • пробел — огонь из лазерных пушек — выход из игры.
    Игра использует DirectDraw, DirectInput, DirectSound и DirectMusic, поэтому убедитесь, что в системе установлен Объекты в системе обнаружения попаданий
    Объекты после визуализации
    Виртуальные ограничивающие прямоугольники
    Рис. 1.22. Использование двумерных ограничивающих
    прямоугольников для обнаружения попаданий
    Резюме
    Эта глава представляет собой лишь начало введения в программирование трехмерных игр. Самым важным здесь является компилирование DirectX программ. Кроме того, мы рассматриваем основы программирования игр, игровой цикл, основы аксонометрического преобразования 3D объектов, а также использование компилятора.
    Здесь вкратце рассмотрена библиотека
    T3DLIB, разработанная в предыдущей книге
    Программирование игр для Windows. Советы профессионала. Она позволит нам сосредоточиться на программировании трехмерных игра не на создании поверхностей, изучении интерфейса и загрузке звука. Теперь, когда вы уже умеете компилировать, поэкспериментируйте с игрой — добавьте противников, астероиды, что нибудь еще — и приступайте к чтению новой главы
    1   2   3   4


    написать администратору сайта