
- •Содержание
- •Введение
- •Графика в Java
- •Java 2d
- •Компонент и контейнер
- •Иерархия классов awt
- •Графические примитивы
- •Методы класса Graphics
- •Java 3d
- •Популярные движкиJava 3d
- •Сцены Java 3d.
- •Разработка классов для приложения «Лабиринт»
- •Создание первичных 3Dмоделей.
- •Разработка классов программы
- •Заключение
- •Список литературы
- •Приложение 1. Листинг программы
Разработка классов для приложения «Лабиринт»
Создание первичных 3Dмоделей.
Для разработки видеоигры было принято решение использовать движок jPCT — 3d движок для Java позволяющий использовать OpenGL и Software рендеры
Как любой 3d движок jPCT предоставляет классы Object3D, Сamera, World. jPCT поддерживает несколько форматов 3d моделей. В данном случае для разработки трехмерных моделей был использован 3DпакетCinema4D.
Рисунок 1. Модель лабиринта без текстур
Рисунок 2. Модель протагониста (мышь) без текстур
Рисунок 3. Модель цели игры
3ds модели загружаются с помощью статического метода класса Loader load3DS который вернет Вам массив объектов 3ds сцены. Перед загрузкой 3d объектов желательно загрузить текстуры, тогда текстурирвание призойдет автоматически при условии что имена текстур соответствуют информации полученной из 3ds файла. Текстуры загружаются следующим образом:
final TextureManager texMan = TextureManager.getInstance(); texMan.addTexture( "TextureName.png", new Texture ( "TextureFileName.png" ) );
Разработка классов программы
Особенностью jPCT является то, что он поддерживает software рендер и OpenGL.
Создание фреймбуфера:
final FrameBuffer buffer = new FrameBuffer(800, 600, FrameBuffer.SAMPLINGMODE_NORMAL); buffer.disableRenderer(IRenderer.RENDERER_SOFTWARE); buffer.enableRenderer(IRenderer.RENDERER_OPENGL);
Загрузка базовой сцены во фреймбуфер:
buffer.clear(java.awt.Color.BLUE); // цвет фона
theWorld.renderScene(buffer); theWorld.draw(buffer); buffer.update(); buffer.displayGLOnly();
Рисунок 4. Базовая сцена
Как видно на рисунке 4, сцена вцелом представляет из себя синий фон, так-как модели и текстуры еще не загружены, а источники освещения не предусмотрены.
После создания объектов их нужно добавить в мир с помощью метода addObject класса World. В программе может быть несколько объектов World, но при этом каждый объект может принадлежать только одному из них. Перед тем как отображать объекты их нужно «построить», при этом вычисляются нормали, ограничивающий прямоугольник и др.
Это можно сделать вызовом метода buildAllObjects() класса World. Создали мир, теперь как говорится да будет свет!
Свет добавляем методом addLight при этом указав его координаты и интенсивность красного зеленого и голубого цвета. Все координаты в jPCT задаются в основном в виде SimpleVector(класс jPCT), хотя сохранилась и «старая» форма с тремя координатами float. То, как мы все это увидим определяет камера (Рис. 5).
Рисунок 5. Финальная визуализация
Камеру можно двигать, поворачивать, направлять на объект и направлять параллельно оси z объекта(align).
Помимо собственно рендера в jpct есть классы для обработки пользовательского ввода. Для ввода с клавиатуры это класс KeyMapper. Вы просто создаете новый объект KeyMapper а потом можете в любое нужное время получить состояние клавиш с помощью вызова poll().
Также есть детектор столкновений. В нашей игре мышь будет стукаться об стенки а в конце столкновение мыши и сыра вызовет конец игры. Поэтому для объекта мыши вызовем метод:
setCollisionMode( Object3D.COLLISION_CHECK_SELF ).
А для сыра и стенок:
setCollisionMode( Object3D.COLLISION_CHECK_OTHERS ).
Сыр еще будет нас оповещать о столкновении чтобы мы знали что игра закончилась:
( addCollisionListener(this) ).
Теперь каждый раз когда мышь двигается нужно вызывать метод класса Object3D:
checkForCollisionEllipsoid
(
SimpleVector //перемещение,
SimpleVector //эллипсоид приблизительно описывающий мышь,
).
Помимо еллипсоида можно использовать сферу и куб — соответственно методы
checkForCollisionSpherical(...),
checkForCollision(...).