Está en la página 1de 39

Prof.

 Andrés Eloy Castillo
Java3D

Java 3D es un API de Java.


En general una API (Application Program Interface) es una librería de programas,
que funciona como interface para el programador,
programador el programador llama a los
programas de la API, y estos programas realizan tareas especificas.
En programación orientada a objetos, no se habla de programas, se habla de clases.
J 3D es por lo
Java3D l tanto
t t una particular
ti l librería
lib í de
d clases,
l d la
de l cuall se instancian
i t i objetos.
bj t
Estos objetos tienen relación con la producción de escenas 3D.
Esta presentación tiene por objetos, familiarizarlo con las diferentes clases de la
biblioteca de Java 3D y la relación que los objetos, que se producen a partir de estas
clases, tienen con los elementos estáticos y dinámicos de las escenas 3D.

Biblioteca
Bibli t
API de
Clases.
Prof. Andrés Eloy Castillo
Elementos de un escena 3D + evidente
Lo 

Una escena 3D tiene al menos.

• Objetos visibles
Los cuales tienen
• Posición.
• Orientación.
• Color
Color.
• Textura
• Transparencia
• Geometría
• Luces
Las cuales tienen: Cambios en el tiempo
• Características de difusión de la luz. Los elementos pueden cambiar de
• Posición. • Posición.
• Orientación • Orientación
• Color • Tamaño
• Fondo Los cambios pueden ocurrir:
• Color
C l • Como respuestas a eventos del 
Como respuestas a eventos del
• Imágenes asociadas usuario.
• Programados (animación).
Prof. Andrés Eloy Castillo
Punto de Vista

Cada posición de observación


ggenera su p
propia
p imagen.
g

Prof. Andrés Eloy Castillo
Representación

Una escena 3D requiere de un lugar de representación.
Generalmente se le llama Canvas
Generalmente se le llama Canvas al
al “lienzo”, que soporta la representación 
lien o , que soporta la representación
gráfica.
Prof. Andrés Eloy Castillo
Objetos Visibles

En Java3D todo objeto visible,


instancia de Shape3D o de una
clase que desciende de Shape3D.
Shape3D

La información asociada a la geometría del objeto, se encapsula 
en objetos que instancian la clase Geometry.

La información asociada al color, textura, material y 
transparencia se almacenan en objetos de la clase Appearance.

Shape3D

Geometry Appearance

Prof. Andrés Eloy Castillo
Asociando geometrías y apariencias a las objetos Shape3D.

En Java3D, podemos asociar geometrías (Geometry) y apariencias (Appearance), a una 
En Java3D podemos asociar geometrías (Geometry) y apariencias (Appearance) a una
forma 3D (Shape3D), utilizando 2 de sus métodos: setGeometry y setAppearance

Ejemplo:

Suponga que tenemos dos objetos: geometria y apariencia, que instancian de Geometry
y de Appearance respectivamente.

Queremos asociar esta información a un objeto de la clase Shape3D.

Haríamos lo que sigue:

Shape3D   forma3D = new Shape3D();   // Se crea un objeto de la clase Shape3D.
forma3D.setGeometry(geometria);   // Se asocia forma3D al objeto geometria.
forma3D.setAppearance(apariencia): se asocia forma3D al objeto apariencia.

Prof. Andrés Eloy Castillo
Recordar que:
• Los objetos visibles pertenecen a la clase Shape3D.
• La información de forma,
forma viene encapsulada,
encapsulada en obje‐
obje
tos de la clase Geometry.
• La información de textura,
textura material,
material transparencia y
color, viene en objetos, de la clase Appearance.

La asociación de un objeto de la clase Shape3D y objetos de la clase Geometry y 
Appearance se hace a través de dos métodos de Shape3D.
• setGeometry
• setAppearance
Shape3D

Geometry Appearance
Prof. Andrés Eloy Castillo
Posición, orientación y escala.

Los objetos visibles, no se mueven, ni giran, ni cambian de tamaño, por si 
mismos. 
Quienes se encargan de trasladar, rotar y/o escalar, los objetos visibles 
3D, son objetos del tipo TransformGroup.
Entonces, si de quiere trasladar, rotar y/o cambiar de tamaño a un objeto 
visible (clase Shape3D o descendientes), es necesario crear un objeto del 
tipo TransformGroup.

La relación entre un TransformGroup y un Shape3D, es de padre a hijo.
Un TransformGroup, puede tener muchos hijos.
TG
Un Shape3D solo puede tener un padre.
// objetoVisible3D un objeto Shape3D, creado previamente.
TransformGroup tg = new TransformGroup();
= new TransformGroup();
Shape3D    objetoVisible3D =  new Shape3D(); Shape3D
tg.addChild(objetoVisible3D);
Prof. Andrés Eloy Castillo
Prof. Andrés Eloy Castillo

Transform3D
Ciertamente, que los objetos Transform‐
Group, realizan operaciones de traslación,
rotación y escalamiento …………

Métodos: rotX, rotY, rotZ, setTranslation & 
scale

Pero los cálculos los realizan objetos de la clase Transform3D.


Transform3D, aplica cálculos complejos con matrices 4x4,
Transform3D 4x4 y sus resultados,
resultados los aplica los
objetos TransformGroup a sus hijos.

Transform3D, tiene un método denominado setTransform, con el cual se conecta con un


Transform3D y realiza las transformaciones que señala este objeto (Transform3D).

// objetoVisible3D ya existe, (creado previamente).
TransformGroup tg = new TransformGroup();  tg.addChild(objetoVisible3D);
= new TransformGroup(); tg addChild(objetoVisible3D);
Transform3d   tf3D = new Transform3D();  tf3D.rotX(Math.PI/4.0);
Tg.setTransform(tf); // RESULTADO: el objeto visible rota en relación al eje X, 45°.
Los puntos de inserción
BranchGroup

Mientras que un TransformGroup, tiene como objeto, causar


traslación, rotación o cambio de tamaño a aquellos objetos
Shape3D, que sean sus hijos, los objetos BranchGroup, actuan
como puntos de inserción,
inserción que agrupan directamente a
objetos Shape3D, a objetos TransformGroup y a otros tipos
de objeto, como son las luces.
En java3D, los objetos BranchGroup son parte integral y
frecuente, en la construcción de las escenas 3D.
BG

TG BG

Prof. Andrés Eloy Castillo
Relaciones entre BranchGroup, TransformGroup y Shape3D

• Un BranchGroup puede tener hijos BranchGroup, TransformGroup o


Shape3D.
• Un TransformGroup puede tener hijos del tipo BranchGroup,
TransformGroup o Shape3D.
• Un Shape3D, no puede tener hijos, solo puede tener uno y solo un
padre.

Un Shape3D, puede relacionarse con objetos Geometry
p ,p j y yy con objetos Appearance.
j pp
Los objetos Geometry y Appearance, le dan forma, color, textura, transparencia, 
tipo de material, a los objetos Shape3D.
Para relacionar objetos Shape3D, con objetos Geometry y objetos apariencia, los 
objetos Shape3D, cuentan con los métodos setGeometry y setAppearance. 

Las relaciones entre objetos BranchGroup, TransformGroup y Shape3D, son 
relaciones de padre a hijo BranchGroup y TransformGroup, utilizan el método 
relaciones de padre a hijo. BranchGroup y TransformGroup utilizan el método
addChild. (addChild podria traducirse, como agregar un hijo).

Prof. Andrés Eloy Castillo
Algunas clases que descienden de Shape3D.

Box
Cylinder

Cone

Estas formas básicas, permiten la creación de figuras 
complejas por composición al agregar, trasladar, rotar 
y cambiar de tamaño estos objetos.
bi d t ñ t bj t

Estas formas instancias de clases que descienden de 
Shape3D, admiten cambios en color, textura,
Shape3D, admiten cambios en color, textura, 
material y transparencia.
sphere
Prof. Andrés Eloy Castillo
Un ejemplo ……
El satélite, tiene como elemen‐
tos fundamentales,
fundamentales objetos de
la clase Box y de la clase
Cylinder:
Box
• El cuerpo (caja roja).
• Los paneles solares (cajas azu‐
les).
les)
Cylinder
• El eje que mantiene a los pa‐ Shape3D
neles ((tubo blanco).
) • Las antenas parabólicas grises, ele‐
mentos Shape3D, con elementos Geo‐
Cone
metry y Appearance, asociados.
• Conos de iluminación de las • Los elementos Geometry, modelan
antenas (conos amarillos). una paraboloide.
Sphere • Los elementos Appearance, le consig‐
• La tierra, una esfera a la cual nan el color gris.
se le agregó textura. Prof. Andrés Eloy Castillo
ColorCube
Constructores
• ColorCube()
• ColorCube( double longitudArista)

ColorCube es una clase que desciende, de Shape3D, 
ya viene asociada con elementos de Geometry
i i d l t d G t y de 
d
Appearance.
Se puede escoger el tamaño designando la longitud 
de la arista.

ColorCube es muy útil, en la fase de aprendizaje de 
java3D.

Prof. Andrés Eloy Castillo
Prof. Andrés Eloy Castillo
PlatFormView y View + = View

PlatformView

View es una clase de java3D, que representa el punto de  vista de 
es una clase de java3D que representa el punto de vista de
la escena 3D y que toma en cuenta elementos físicos, de 
ambiente y de representación de la imagen.
PlatformView es una clase que se relaciona con View y con un 
es una clase que se relaciona con View y con un
TransformGroup.
View
• Los objetos PlatformView, son manipulados por objetos 
TransformGroup.
• La posición y orientación de un objeto PlatformView, determina 
El punto de vista de la escena.
• Para cambiar un punto de vista, usaremos Transform3D, para 
f
calcular posición y orientación, TransformGroup para realizar la 
transformación y un objeto View asignado como hijo de 
a s o G oup pa
TransformGroup para captura de la imagen, desde la posíción
a captu a de a age , desde a pos c ó yy 
orientación calculada por Transform3D.
PlatformView
Prof. Andrés Eloy Castillo
View PlatformView

View Canvas3D Screen3D

PhysicalBody PhysicalEnvironment

View
Prof. Andrés Eloy Castillo
Canvas3D

Un Canvas3D,
Canvas3D es el “lienzo”
lienzo , donde se forma la imagen,
imagen la
cual depende del punto de vista, determinado por Plat‐
formView y View y de los elementos Shape3D, las luces,
l fondos
los f d y los
l valores
l d otros objetos
de b asociados..
d

Canvas3D tiene características de componentes awt,


por lo que se puede insertar en paneles o en venta‐
nas.

Prof. Andrés Eloy Castillo
View & Canvas3D

El Canvas3D debe agregarse al View a través del método addCanvas3D, de 
View

Supongamos un objeto canvas3D que instancia de una clase Canvas3D

View vista = new View(); // se crea el objeto vista como una instancia de View.


vista addCanvas3D(canvas3D); // Se relaciona el Objeto Canvas3D a partir del
vista.addCanvas3D(canvas3D); // Se relaciona el Objeto Canvas3D a partir del                        
// método addCanvas3D
Prof. Andrés Eloy Castillo
PhysicalBody

PhysicalBody contiene la información de las


propiedades físicas del usuario.
Por ejemplo PhysicalBody
• Posición de los ojos.
• Separación de los ojos.
En general, se trabaja con la configuración por Código
defecto, pero es un elemento de personali‐ Relacionando View y PhysicalBody.
zación de los programas de 3D, que se harán
importantes, en la medida que escalemos en View vista = new View();
Vi i Vi ()
complejidad y realismo, por ejemplo, para la PhysicalBody pb = new PhysicalBody();
utilización en 3D iterativa, o en un simulador vista.setPhysicalBody(pb);
de vuelos.

Prof. Andrés Eloy Castillo
PhysicalEnvironment

PhysicalEnvironment Define el medio am‐


biente que existe entre el usuario y el
programa
programa. PhysicalEnvironment
Por lo tanto tiene que ver con los perifé‐
ricos, como por ejemplo los Joystick.
.
Código
En general, se trabaja con la configuración Relacionando View y PhysicalEnvironment.
por defecto, pero es un elemento de perso‐
nalización de los programas de 3D, que se View vista = new View();
()
PhysicalEnvironment pe = new PhysicalEnvironment();
harán importantes, en la medida que escale‐ vista.setPhysicalEnvironment(pe);
mos en complejidad y realismo, por ejem‐
plo, para la utilización en 3D iterativa, o en
un simulador
i l d de d vuelos,
l d d queramos
donde
incluir guantes especiales, joystick, etc.
Prof. Andrés Eloy Castillo
Entonces …………

Transform3D
Realiza los cálculos
Realiza los cálculos.

View captura la imagen, desde la posición y orientación, 

TransformGroup
impuesta por un f a TG

Un PlatfomView. 
La relación entre TransformGroup y PlatformView, es de padre a hijo.
Un TransformGroup agrega hijos del tipo View, con el método addChild.
Un TransformGroup agrega hijos del tipo View, con el método addChild. View

La relación entre PlatformView y View es de asociación.
PlatformView
Prof. Andrés Eloy Castillo
Armando la rama de visualización.

PlatformView

S
Suponemos que ya existe un objeto Canvas3D (canvas3D), correctamente configurado.
it bj t C 3D ( 3D) t t fi d

View vista = new View();


PlatformView platformView = new PlatformView(); Falta un elemento Transform‐
Ph i lB d pb
PhysicalBody b = new PhysicalBody();
Ph i lB d () G
Group que “adopte” a Plat‐
“ d t ” Pl t
PhysicalEnvironment pe = new PhysicalEnvironment(); formView
vista.attachPlatformView(platformView);
vista.addCanvas3D(canvas3D);  // Recuerde que estamos suponiendo que canvas3D fue creado,
//
// previamente.
i t
vista.setPhysicalBody(pb);
vista.setPhysicalEnvironmment();
Prof. Andrés Eloy Castillo
Separando elementos de la escena y el punto de vista.

Dos Ramas
• Una para la visualización (renderización) de la escena.
• Definir el punto de vista, posición y orientación, las características
d l usuario,
del i losl elementos
l i
iterativos
i (j
(joystick,
i k lentes
l 3D por
3D,
ejemplo), el elemento donde se plasman las imágenes de las escenas
y el tipo de visualizador con sus características técnicas.
• La otra para enlazar los elementos que están en la escena.
escena
• Esta seria lo que denomina la rama de volumen, es la rama que se
encarga de definir los elementos que serán visibles, en la escena,
cual será su textura, su tipo de material, su color, su transparencia y
su geometría, también en esta rama se define los tipos, cantidad,
orientación y posición de los elementos de iluminación, se define el
fondo de la escena y se define los alcances de los elementos, p por
ejemplo cual es el volumen de incidencia de una luminaria.

Prof. Andrés Eloy Castillo
Locale Referencia e integración.

Locale son objetos en Java3D, que tienen entre sus


funciones, brindar un sistema de referencia, necesario
para ubicar elementos tanto en posición, como en
orientación.
orientación
Locale
Otra función
Ot f ió ded Locale,
L l es lal de
d conectart
las dos ramas, la de volumen y la de visua‐
lización.

Rama Visualización.
Rama Volumen

Prof. Andrés Eloy Castillo
VirtualUniverse El que agrupa todos los elementos

Un objeto VirtualUniverse, agrupa las ramas volumétricas y de


visualización, y el elemento Locale que enlaza estas dos ramas.

En general, debería incluirse uno y solo un elemento Virtual‐


Universe por programa.

Un VirtualUniverse podría agrupar mas de una rama volumé‐


trica y más de una rama de visualización,, aunqueq por lo
p
general es suficiente con manejar una sola rama de volumen y
otra de visualización.

Prof. Andrés Eloy Castillo
El Grafo

Un grafo es una representación gráfica, da cuenta de la forma


en que se relacionan una serie de objetos.
En un grafo, a los elementos que se relacionan se le denomi‐
nan nodos, y a la relación que los vincula, se les denomina
arco.
Nodo Nodo

El concepto de grafo, se
puede aplicar a las escenas
gráficas.
Podemos hablar entonces
de los grafos de escena.

Nodo

Nodo
Prof. Andrés Eloy Castillo
El Grafo de Escena

Los elementos VirtualUniverse, Local, BranchGroup, Transform‐


Group Shape3D,
Group, Shape3D PlatformView,
PlatformView View,
View PhysicalBody,
PhysicalBody PhysicalEnvi‐
PhysicalEnvi
ronment, Canvas3D y otros, se relacionan entre si, de una manera
determinada.
A la representación en forma de grafo, de estos elementos se les
denomina Grafo de Escena.
A cada escena gráfica, le corresponde un Grafo de Escena, escenas
diferentes implican Grafos de Escenas diferentes.
El Grafo de Escena es una herramienta importante y útil para el
programador, por que le permite, codificar la escena gráfica, para
después materializarla con relativa facilidad.

Prof. Andrés Eloy Castillo
Ejemplo de un Grafo de Escena En general la rama de visua‐
lización mantiene la misma es‐
tructura, y los cambios se dan
en las transformaciones que
realiza el TG de esta rama.
La rama de d volumen,
l varia
mucho según la escena, en la
misma medida que varían el
número,, p
posición,, apariencia
p de
los elementos; el fondo de la
escena y los elementos de ilu‐
minación.

Prof. Andrés Eloy Castillo
SimpleUniverse Para simplificar los programas 3D.

Se utiliza SimpleUniverse
para preocuparse solamen‐
te de la rama Volumen de la
Escena Gráfica.

Prof. Andrés Eloy Castillo
Prof. Andrés Eloy Castillo

SimpleUniverse.getPreferredConfiguration().

No pierda de vista que ……………….

SimpleUniverse es una clase que agrupa todos los componentes de una escena 3D.

Esto quiere decir que SimpleUniverso debe contener, objetos de los siguientes
tipos VirtualUniverse,
tipos: VirtualUniverse Locale,
Locale TransformGroup,
TransformGroup PlatformView,
PlatformView View,
View Physical‐
Physical
Body y PhysicalEnvironment.
Cada una de estos objetos está preconfigurado.
Los objetos Canvas3D, deben ser configurados, en función especifica de la
maquina que aloja el programa, SimpleUniverse, tiene un método estático, para
conseguir implementar la configuración del objeto instancia de Canvas3D.
El método se denomina getPreferredConfiguration().

Usaremos el método getPreferredConfiguration, cada vez que queramos crear un objeto Canvas3D.
GraphicsConfiguration

Los objetos del tipo GraphicsConfiguration, describen las características de un


destino gráfico tales como una impresora o un monitor. Pueden existir muchos
objetos
bj d l tipo
del i GraphicsConfiguration
G hi C fi i asociados
i d a un simple
i l dispositivo
di i i gráfico,
áfi y
representan diferentes modos o capacidades de renderizar.
La estructura de GraphicsConfiguration variará de acuerdo a la plataforma:
Windows Linux,
Windows, Linux Unix,
Unix etc.
etc

En el caso de Windows, GraphicsConfiguration, se carga con información del


numero de líneas por el numero de columnas y del modelo de color de los
elementos
l t gráficos.
áfi

No se pueden crear objetos tipos GraphicsConfiguration, utilizando constructores,


se requiere
q de la utilización de métodos q que interroguen
g al hardware de la
maquina y dependiendo de sus características particulares, creen un
GraphicsConfiguration con los valores del equipo, uno de los métodos que fabrican
objetos del tipo GraphicsConfiguration es getPreferredConfiguration() de la clase
SimpleUniverse.
SimpleUniverse

Prof. Andrés Eloy Castillo
GraphicsConfiguration es un objeto de la librería awt.
Entonces debe usarse import java.awt.*;

Como crear un objeto Canvas3D


Como crear un objeto Canvas3D

• Se interroga al hardware de la maquina con getPreferredConfiguration() y el 
resultado de la consulta se le asigna a un objeto GraphicsConfiguration.
• Se declara y se crea un objeto del tipo Canvas3D.
• Para la creación del Canvas3D se utiliza el constructor de Canvas3D que tiene como 
argumento único un objeto del tipo GraphicsConfiguration.

// Sección de código de ejemplo, creación objetos Canvas3D
GraphicsConfiguration
p g configg = SimpleUniverse.getPreferredConfiguration();
p g g ();
Canvas3D canvas3D =  new Canvas3D(config);

Prof. Andrés Eloy Castillo
SimpleUniverse

• Crear una clase que herede de JFrame.
RECETA
Esta clase servirá de ventana principal 
de visualización.
CREAR
• Crear un objeto Canvas3D, configurarlo en 
MUNDOS 
con el método getPreferredConfigura‐
tion() de SimpleUniverse
tion() de SimpleUniverse.
VIRTUALES
GraphicsConfiguration config;
Config = SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);

• Crear un objeto SimpleUniverse .
• Utilice el constructor que lo relaciona directamente con el Canvas3D.
• SimpleUniverse u = new
u = new SimpleUniverse(canvas3D).
SimpleUniverse(canvas3D)
• Agregar parámetros por defecto, al objeto SimpleUniverse
• u.getViewingPlatform().setNominalViewingTransform();

Prof. Andrés Eloy Castillo
Receta para generar mundos Virtuales II 
• Generar un BranchGroup.
• Este objeto BranchGroup, pasa a ser la base de la rama Volumetrica.
• A esta rama se le agregarán TransformGroup, BranchGroup o Shape3D, 
dependiendo de la complejidad de la escena.
• Para agregar elementos al objeto tipo BranchGroup se utiliza el método 
addChild de esta clase. //Sección código de crear Rama.
//
// En este caso se le agrega un ColorCube
g g
BranchGroup bg = new BranchGroup();
ColorCube cuboColor = new ColorCube();
bg.addChild(cuboColor);

• Agregar el BranchGroup
l hG al SimpleUniverse
l Si l i
• Utilizar el método addBranchGroup de la Clase SimpleUniverse
• //Sección código de agregar rama volumen a SimpleUniverse
• // u es un SimpleUniverse y bg es un BranchGroup
• u.addBranchGraph(bg);
• Compilar la rama de volumen.
• //Sección Código de compilación rama volumen
//Sección Código de compilación rama volumen
• //bg es un BranchGroup, con descendencia ya agregada.
• bg.compile();
Prof. Andrés Eloy Castillo
C l C b
ColorCube

Algunos
Ejemplos
Bá i
Básicos …………
Prof. Andrés Eloy Castillo
Creación de la ventana básica de demostraciones

Utilizaremos la misma clase 
VentanaDemoJava3D en todos los ejemplos.

Prof. Andrés Eloy Castillo
1er Ejemplo un cubo de colores

BranchGroup

TransformGroup

ColorCube

Rama Volumen

Prof. Andrés Eloy Castillo
Ejecutando Prueba01
j

Prof. Andrés Eloy Castillo

También podría gustarte