Платформа Java3D. Источники информации Мы будем использовать следующие источники иформации: 1. и иже с ним 2.j3d tutorial (!) 3.j3d.

Презентация:



Advertisements
Похожие презентации
Платформа Java3D. Источники информации Мы будем использовать следующие источники иформации: 1. и иже с ним 2.j3d tutorial (!) 3.j3d.
Advertisements

©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Applets Inna Issajeva. Апплеты это маленькие приложения, которые размещаются на серверах Internet, транспортируются клиенту по сети, автоматически устанавливаются.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Создание форм в Access Выполнил: Усманов Шохрух. Формы это важнейшие объекты базы данных, окна, через которые пользователи могут просматривать и изменять.
Ресурсы WPF Два типа ресурсов WPF: объектные ресурсы (object resource) – определенный.NET-объект, который можно использовать многократно; ресурсы сборки.
Тема: Управление потоком в PHP Изучить возможности языка PHP при решении задач, требующих использования условного оператора. Рассмотреть примеры управления.
В. Дихтяр ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ (для бакалавров) Российский университет дружбы народов Институт гостиничного бизнеса и туризма Раздел 1.Разработка.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
OOП Инна Исаева. Подпрограмма – это большая программа, разделённая на меньшие части. В программе одна из подпрограмм является главной. Её задача состоит.
Что такое язык сценариев Action Script?. В начале 21 века трудно встретить человека, который не пользовался бы сетью Интернет. Здесь ежедневно находятся.
Microsoft ® Office SharePoint ® Server 2007 Учебный курс Библиотеки документов SharePoint III. Работа с журналом версий.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Аффинные преобразования Графический конвейер Астана. Лекция 7.
Что такое реальный мир? а виртуальный? где следует проложить границу между ними?
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
Высокоуровневые методы информатики и программирования Лекция 10 События.
ЦИКЛИЧЕСКИЙ АЛГОРИТМ Цели: -Познакомиться с понятием циклического алгоритма. -Освоить языковые средства для реализации циклических алгоритмов.
Транксрипт:

Платформа Java3D

Источники информации Мы будем использовать следующие источники иформации: 1. и иже с ним 2.j3d tutorial (!) 3.j3d API specification 4.java3d API documentation J3D tutorial отстает по версии от API (1.2 < 1.6) // 2001г. - tutorial

Средства разработки (IDE) Будем, как обычно, использовать Eclipse. Нужно будет скачать дополнительные пакеты Java3D Java 3D downloads: Библиотеки: 1.j3dcore.jar 2.j3dutils.jar 3.vecmath.jar Помимо Java3D еще существует JOGL – JavaOpenGL. Java3D использует для построения изображения под разными ОС разные графические API – Microsoft DirectX (только под Windows) и OpenGl (под различные ОС) (в находящемся в разарботке Java3D 2.0 заявлена поддержка DirectX 10)

Главы Java3D Getting StartedCreating ContentInteractionAnimationLightsTextures

Основные понятия (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.awt package javax.vecmath package javax.vecmath package определяет классы для работы с точками. Векторами, матрицами, …

Основные понятия (2) visual object – объект графа сцены (например, куб или сфера) object – экземпляр класса content – в целом объекты графа сцены Виртуальная вселенная создается из графа сцены. Узел – элемент данных (экземпляр класса из Java3D). Дуга – отношение между элементами. 2 типа отношений: parent-child relationship. Так Group node может иметь любое число детей и только одного родителя. Leaf node может иметь только одного родителя и не может иметь детей. reference relationship. Ссылка ставит в соответствие объекту класса 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 (геометрия, внешний вид, поведение, положение, звук, освещение)

ScreenGraphObjectNodeGroupBranchGroupTransformGroupLeafShape3dLightBehavior NodeComponent Иерархия классов Java3D

Рецепт написания программы на 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 (живой), а следовательно и все объекты этой ветви (branch graph) тоже живыми. У этого есть несколько последствий. 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

Behaviors Наследники класса Behavior отвечают за анимацию и взаимодействие – за счет изменения графа сцены (объектов в нем) Behavior – связь между побуждением(stimulus) и действием(action)

Иерархия наследников Behavior

Механика Behaviors Для создания наследника класса поведения необходимо реализовать методы из абстрактного класса Behavior initialization processStimulus Метод initialization вызывается, когда граф сцены, содержащий наш behavior становится живым. Этот метод ответственен за установку начального события- триггера для поведения и начальных значений собственных переменных поведения. Триггер определяется объектом класса WakeupCondition или их комбинацией. Метод processStimulus вызывается, когда происходит событие, определенное для данного поведения. Этот метод ответственен за обработку события. Так как несколько событий может содержаться в одном объекте WakeupCondition (к примеру, различные комбинации нажатых клавиш в одном WakeupOnAWTEvent), то необходимо производить декодирование события. Обычно этот метод изменяет объект, на который настроено поведение (object of change) и переустанавливает триггер. Рецепт: 1.Написать конструктор. Сохранить ссылку на объект изменения 2.Переопределить public void initialization(). Определить начальный триггер срабатывания 3.Переопределить public void processStimulus(). Декодировать условие срабатывания, отреагировать согласно условию, переустановить триггер (если необходимо)

Маленькие ловушки Программисты на Java3D чаще всего допускают следующие ошибки: забывают установить (переустановить) триггер срабатывания не возвращаются из методов класса поведения Если не установить изначальный триггер, поведение никогда не будет вызвано. Менее очевидно, что необходимо переустановить триггер заново в методе processStimulus (при желании повторного срабатывания) Так как и initialization, и processStimulus вызываются самой системой Java3D, они должны возвращать управление, для того чтобы система рендеринга могла продолжить работу. К примеру, если необходимо вращающее поведение, необходимо периодически обновлять угол и TransformGroup. Если не порождать новый поток выполнения, то ничего нового не будет отрендерено.

Использование поведений Во-первых необходимо, чтобы в графе сцены присутствовали необходимые объекты. Чаще всего это соответствующая(ие) TransformGroup. Затем необходимо добавить объект нашего класса поведения в граф сцены – иначе поведение просто не сможет инициализироваться. На самом деле он просто станет мусором и будет собран при следующей же сборке мусора. Ну и, наконец, необходимо установить соответствующие ShedulingBounds (область действия) для поведения. Поведение может быть активно только в том случае, если его область действия пересекается с ViewPlatform's activation volume. Только активные поведения могут срабатывать. Итак, рецепт прост: 1.Подготовить граф сцены 2.Поместить в граф сцены объект поведения со ссылкой на объект изменения 3.Установить область действия 4.Подходящим образом установить способности чтения/записи (write/read capabilities) И здесь есть часто допускаемые ошибки: не устанавливается область действия (корректно) поведение не добавляется в граф сцены

Некоторые методы класса Behavior и ViewPlatform Behavior: void initialize() Initialize this behavior. void postId(int postId) Post the specified Id. void processStimulus(java.util.Enumeration criteria) Process a stimulus meant for this behavior. void setEnable(boolean state) Enables or disables this Behavior. void setSchedulingBounds(Bounds region) Set the Behavior's scheduling region to the specified bounds. void wakeupOn(WakeupCondition criteria) Defines this behavior's wakeup criteria. ViewPlatform: float getActivationRadius() void setActivationRadius(float activationRadius)

Условия Активации Поведения Активные поведения срабатывают, когда происходит одно ли несколько событий, на которые установлен триггер поведения

Основы создания VisualObjects(1) Узел Shape3D графа сцены определяет visual object (визуальный объект) (есть и другие способы, в обход Shape3D). Shape3D – один из наследников класса Leaf. Объект класса Shape3D не содержит информации о форме или цвете визуального объекта. Эта информация хранится в объектах класса NodeComponent на которые есть ссылки в объектах класса Shape3D (по одной ссылке на Geometry node component (начиная с Java3D API 1.2 возможно несколько) и по одной на Appearance node component) Конструкторы Shape3D: Shape3D() Shape3D(Geometry geometry) Shape3D(Geometry geometry, Appearance appearance)

Основы создания VisualObjects(2) До тех пор, пока Shape3D не является живым или скомпилированным, ссылки на NodeComponent-ы можно менять. void setGeometry(Geometry geometry) void setAppearance(Appearance appearance) Их можно применять и к живым или скомпилированным объектом при установке соответствующих capabilities: ALLOW_GEOMETRY_READ | WRITE ALLOW_APPEARANCE_READ | WRITE

Скелет VisualObject Можно рассмотреть подобный шаблон написания своих визуальных объектов как наследников Shape3D: public class VisualObject extends Shape3D{ private Geometry voGeometry; private Appearance voAppearance; public VisualObject() { voGeometry = createGeometry(); voAppearance = createAppearance(); this.setGeometry(voGeometry); this.setAppearance(voAppearance); } private Geometry createGeometry() { } private Appearance createAppearance () { }

Альтернативы Shape3D Второй возможный способ создания визуального объекта – опеделить класс-контейнер, не являющийся наследником никого из иерархии классов Java3D API. В таком случае он должен будет иметь Group Node или Shape3D в качестве корня подграфа, им определяемого. У класса должен быть соответствующий метод для возврата ссылки на этот корень. Третий возможный способ организации визуального объекта – при помощи классов Box, Cone, Cylinder и Sphere определенных в пакете com.sun.j3d.utils.geometry. Каждый из их является наследником Primitive, который в свою очередь является наследником Group.

Geometry Primitives - Box, Cone, Cylinder и Sphere Mathematical Classes - Point*, Color*, Vector*, TexCoord* - наследники Tuple* Собственно сам Geometry Это абстрактный класс. Его наследников можно разделить по следующим категориям: 1) Non-indexed vertex-based geometry (каждый раз, когда объект рендерится, его вершины могут использоваться лишь единожды) 2) Indexed vertex-based geometry ( можно несколько раз использовать одни и те же вершины при рендеринге) 3) Other visual objects (Raster, Text3D и CompressedGeometry) GeometryArray используется для хранения точек, векторов, полигонов (кроме того, там можно хранить цвета, нормали поверхности, координаты текстур) Конструктор GeometryArray(int vertexCount, int vertexFormat) (VertexFormat: COORDINATES: (обязательный бит) | NORMALS | COLOR_3 | COLOR_4 |TEXTURE_COORDINATE_2 | TEXTURE_COORDINATE_3 ) void setCoordinate(int index, float coordinate[]) void setColor(int index, float color[]) void setNormal(int index, float normal[]) void setTextureCoordinate(int texCoordSet, int index, float texCoord[]) Сложную геометрию куда как удобнее создавать в специальных 3d пакетах (3ds Max, Maya, Lightwave, Rhino, …) а для их загрузки использовать GeometryLoader

Иерархия Geometry

Appearance(1) Geometry описывает повершиную информацию об объекте. Но этих данных часто недостаточно для того чтобы полностью описать то, как выглядит объект. В большинстве случаев также нужно appearance (внешний вид). Сам не содержит информации о том как должен выглядеть объект, но ссылается на тех, кто знает об этом (appearance attributes): PointAttributes LineAttributes PolygonAttributes ColoringAttributes TransparencyAttributes RenderingAttributes Material TextureAttributes Texture TexCoordGeneration Все они тоже наследники NodeComponent и вместе составляют то, что называется appearance bundle

Appearance(2) Для задания атрибутов внешнего вида есть соответствующие методы: void setPointAttributes(PointAttributes pointAttributes) void setLineAttributes(LineAttributes lineAttributes) void setPolygonAttributes(PolygonAttributes polygonAttributes) void setColoringAttributes(ColoringAttributes coloringAttributes) void setTransparencyAttributes(TransparencyAttributes transparencyAttributes) void setRenderingAttributes(RenderingAttributes renderingAttributes) Часто выгодно делать эти атрибуты (да и само appearance) общим (share)

Clip Все объекты в Виртуальной вселенной рендерятся лишь в пределах viewing frustum. Настоятельно рекомендуется соотношение: (back clip distance) / (front clip distance) < 3000