170 likes | 361 Views
Платформа Java3D. Источники информации. Мы будем использовать следующие источники иформации: http://www.google.com и иже с ним j3d tutorial (!) j3d API specification java3d API documentation J3D tutorial отстает по версии от API (1. 2 < 1. 6 ) // 2001г. - tutorial.
E N D
Источники информации Мы будем использовать следующие источники иформации: • http://www.google.com и иже с ним • j3d tutorial (!) • j3d API specification • java3d API documentation J3D tutorial отстает по версии от API (1.2< 1.6) // 2001г. - tutorial
Средства разработки (IDE) Будем, как обычно, использовать Eclipse. Нужно будет скачать дополнительные пакеты Java3D Java 3D downloads: https://java3d.dev.java.net/binary-builds.html Библиотеки: • j3dcore.jar • j3dutils.jar • vecmath.jar Помимо Java3D еще существуетJOGL–JavaOpenGL. Java3D использует для построения изображения под разными ОС разные графические API – Microsoft DirectX (только под Windows) и OpenGl (под различные ОС) (в находящемся в разарботкеJava3D 2.0 заявлена поддержка DirectX10)
Основные понятия (1) Scene graph (Граф сцены) - расположение 3-хмерных объектов в древовидной структуре, которое полностью определяет содержимое виртуальной вселенной, а также то как вселенная должна быть отренедрена (rendered) Иерархия классов Java3D - коллекция объектов, описывающих отображаемую виртуальную вселенную. • javax.media.j3d package - вAPI определено более 100 классов в пакете Их часто называют Java3D core classes. Для простых сцен достаточно десятка объектов. Помимо пакета Java3D core, часто используются и другие. • com.sun.j3d.utils package – его часто называютJava3D utility classes. Сore class package включаетв себя лишь низкоуровневые классы, необходимые для программирования на Java3D. Utility classes – удобные и мощные классы, в добавление к основным. 4 основных категории utility classes: content loaders, scene graph construction aids, geometry classes, and convenience utilities. • java.awtpackage • javax.vecmath package javax.vecmath package определяет классы для работы с точками. Векторами, матрицами, …
Основные понятия (2) visualobject–объект графа сцены (например, куб или сфера) object– экземпляр класса content – в целом объекты графа сцены Виртуальная вселенная создается из графа сцены. Узел – элемент данных (экземпляр класса из Java3D). Дуга – отношение между элементами. 2 типа отношений: • parent-child relationship. Так Group nodeможет иметь любое число детей и только одного родителя. Leaf nodeможет иметь только одного родителя и не может иметь детей. • referencerelationship. Ссылка ставит в соответствие объекту класса NodeComponentобъект классаNode из графа сцены. ОбъектыNodeComponent определяют атрибуты геометрии и представления объектов, используемые для построения сцены. Дерево => не должно быть циклов. Единственный путь от корня до листа - scene graph path. Атрибуты визуализации любого объекта зависят только от пути до него в графе сцены. У программиста Java3D обычно нет возможности контролировать процесс рендеринга объектов. (OrderedGroup class node)
Неверный граф сцены и его fix Об ошибке нам сообщат на этапе выполнения: “multiple parent”exception Все будет скомпилировано, но не будет отображаться.
Тонкости с Virtual Universe, Locale У любого графа сцены единственная Виртуальная Вселенная. У объектаVirtualUniverseможет быть несколькообъектов Locale(хотя у большинства все-таки один). Locale – вход ввиртуальную вселенную. Его можно себе представлять как ориентир, по которому определяется положение объектов.В программе на Java3D может быть более одного объекта VirtualUniverse, т.е. более одной виртуальной вселенной. Однако нет встроенного способа коммуникации между ними. Объект не может существовать в нескольких виртуальных вселенных Locale – корень нескольких подграфов в графе сцены. Объект BranchGroup – корень подграфа (ветви графа). 2 вида подграфов: • view branch graph (положение и направление камеры) • content branch graph(геометрия, внешний вид,поведение, положение, звук, освещение)
Рецепт написания программы на Java3d Авторы Java3D API Рекомендуют следующий алгоритм созданияпрограмм на Java3D 1. Создать Canvas3D (наследник Canvas из AWT) 2. Создать VirtualUniverse 3. Создать Locale и присоединить к VirtualUniverse 4. Создать view branch graph a. View b. ViewPlatform c. PhysicalBody d. PhysicalEnvironment e. Присоединить объекты ViewPlatform, PhysicalBody, PhysicalEnvironment, Canvas3D к View 5. Создать content branch graph(s) 6.Скомпилировать branch graph(s) 7. Присоединитьполученные подграфы к Locale Зачастую программы на Java3D имеют одинаковую систему view branch graph. Ввиду этого используют класс SimpleUniverse (вместо шагов 2,3,4)
View branch graph,созданный SimpleUniverse использует экземпляры удобных классовViewingPlatform иViewer вместо основных классов (View Platform, View) используемых для создания view branch graph в первом рецепте.
Простой рецепт Таким образом, создание программы становится еще менее муторным: 1. Создать Canvas3D 2. Создать SimpleUniverse ссылающийся на только что созданный Canvas3D и подходящим образом настроитьSimpleUniverse 3. Создать content branch 4. Скомпилировать content branch graph 5. Вставить content branch graph в Locale нашей SimpleUniverse КонструкторSimpleUniverse: SimpleUniverse() SimpleUniverse(Canvas3D canvas3D) View branch graph включает в себяimage plate. Image plate – прямоугольная область, в которую проецируется содержимое сцены в процессе рендеринга. Так, в качестве image plate можно представлять себе объект Canvas3D – он предоставляетсоответствующее изображение в окнена мониторе компьютера.
Процесс рендеринга По умолчанию, image plate находится в начале координат. Система координат Декартова. Вверх – ось y. Вправо – ось X. На наблюдателя – ось Z.
Еще немного теории(1) У класса ViewingPlatform есть метод • void SetNominalViewingTransform() Отодвигает камеру на 2.41 единицы (метра). С этого расстояния, при стандартном поле видимости, объекты высоты и ширины 2 метраполностью заполняют image plate. У класса SimpleUniverse есть методы: • void addBranchGraph(BranchGroup bg) • ViewingPlatform getViewingPlatform() Перед тем, как наконец-то начать писать программы на Java3D, определим еще 2 понятия… А именно, термины liveиcompiled. Добавление branch graph в Locale делает ветвь live(живой), а следовательно и все объекты этой ветви (branchgraph) тоже живыми. У этого есть несколько последствий. 1) Живые объекты будут отрендерены. 2) Кроме того, нельзя изменять параметры живых объектов, если только не установлена соответствующая capability(способность) у объекта,перед тем как тот станет живым. BranchGroup objects могут быть откомпилированы. Компиляция объекта BranchGroup (и всех его предков(?)) превращает его в более удобную форму для рендерера (того, кто занимается рендерингом изображений)
Еще немного теории(2) Класс BranchGroup имеет метод • compile() Класс SceneGraphObject имеет методы: • boolean isCompiled() • boolean isLive() Нет большой красной кнопки “start the renderer!”. Рендерер Java 3D начинает крутиться в бесконечном цикле, когда branch graph с экземпляром класса View становится живым в virtual universe. Концептуально: while(true) { Process input If (request to exit) break Perform Behaviors Traverse the scene graph and render visual objects } Cleanup and exit