JavaFX: añadir un objeto de malla a un mundo 3D
Los objetos que puede lo más simplemente añadir a su mundo virtual JavaFX se crean usando las tres clases incorporadas de forma 3D que vienen con JavaFX: Cilindro, Box, y Esfera. Para objetos más complejos, debe utilizar la TriangleMesh clase para crear el objeto basado en una serie conectada de triángulos.
Aquí, cree uno de los más sencillos de todos los objetos de malla: la pirámide de cuatro lados se muestra aquí. Visualmente, una pirámide de cuatro lados tiene un total de cinco se enfrenta: las cuatro caras laterales triangulares y la base cuadrada. Pero en una malla JavaFX triángulo, cuadrados no se les permite, sólo triángulos. Así la pirámide en realidad se compone de seis caras: las cuatro caras laterales triangulares y dos triángulos adyacentes que componen la cara.
En esta sección se presenta información muy conceptualmente difícil. Si no has estudiado mallas en una clase de Computación Gráfica, estar preparado para leer los siguientes párrafos varias veces antes de que comience a tener sentido.
Si aún no tiene sentido, tomar un café con leche, saca una hoja de papel cuadriculado, y empezar a hacer garabatos. Dibujo de la pirámide con su propia mano le ayudará a su comprensión. Trate de usar un lápiz.
Para obtener la pirámide comenzado, llame al TriangleMesh constructor de la siguiente manera:
TriangleMesh pyramidMesh = new TriangleMesh () -
Para completar la pirámide, es necesario rellenar tres colecciones que definen la geometría de la malla. Estas colecciones contienen los puntos, las caras y las coordenadas de textura que definen la forma.
Comience con la coordenada de textura colección, porque usted puede casi ignorarlo por esta simple pirámide. Coordenadas de textura son útiles cuando se está utilizando un material que contiene una imagen que debería ser estirado de forma específica sobre el marco de la malla. Ellos le permiten asociar un x- específica, coordenada y de la imagen con cada esquina de cada cara.
Por desgracia, no se puede simplemente dejar de lado las coordenadas de textura, incluso si usted no los necesita, por lo que debe cargar al menos una coordenada. Haga que con esta línea de código:
. pyramidMesh.getTexCoords () addAll (0,0) -
Ahora pasar a las otras dos colecciones. La siguiente es una colección del vértices (es decir, esquinas) que define la forma. Su pirámide cuadrada tiene cinco vértices, que usted puede imaginar que la parte superior, la parte delantera (el punto más cercano a usted), la esquina izquierda, la esquina trasera, y la esquina derecha. Estos vértices están numerados 0, 1, 2, 3, y 4.
Teniendo en cuenta la altura h y la longitud s de cada lado de la pirámide, se puede calcular la x, y, z-coordenadas de cada vértice utilizando las siguientes fórmulas:
Vertex | Corner | X | Y | Z |
---|---|---|---|---|
0 | Cima | 0 | 0 | 0 |
1 | Frente | 0 | h | -s / 2 |
2 | Izquierda | -s / 2 | h | 0 |
3 | atrás | s / 2 | h | 0 |
4 | Correcto | 0 | h | s / 2 |
Con todo esto como telón de fondo, aquí está el código para crear la colección de puntos:
flotar h = 150 - // Heightfloat s = 300 -. // SidepyramidMesh.getPoints () addAll (0,0,0, // Punto 0 - Top0, h, -s / 2, // Punto 1 - Front-s / 2, h, 0, // Punto 2 - Lefts / 2, h, 0, // Punto 3 - Back0, h, s / 2 // Punto 4 - Derecha) -
La colección final define las caras. Las caras se definen especificando el índice de cada vértice que conforma cada cara. Por ejemplo, la cara frontal izquierdo es un triángulo cuyos tres vértices son la parte superior, la parte delantera, y la izquierda. Los índices para estos tres vértices son 0, 2, y 1.
Hay un total de seis triángulos en la pirámide, y sus caras se definen por los siguientes puntos:
Cara | Punto 1 | Punto 2 | Punto 3 |
---|---|---|---|
Frontal izquierdo | 0 | 2 | 1 |
Delantero derecho | 0 | 1 | 3 |
Atrás derecha | 0 | 3 | 4 |
Volver a la izquierda | 0 | 4 | 2 |
Parte inferior trasera | 4 | 1 | 2 |
Frontal inferior | 4 | 3 | 2 |
Aunque puede no ser evidente de esta tabla, el orden en el que aparecen los rostros es fundamental para el éxito de la malla. En general, las caras se enumeran en un sentido antihorario y el orden descendente. Por lo tanto, las cuatro caras laterales envuelven alrededor de la pirámide en sentido contrario a las agujas del reloj. Están seguidos por las dos caras inferiores.
Cada cara de la colección Faces está representada por tres pares de números, cada uno de los cuales representa el índice de uno de los vértices del triángulo y el índice de la textura correspondiente de coordenadas.
Debido a que sólo tiene un elemento de la textura Coordinar colección, el segundo número en cada par siempre será cero. Por lo tanto, la secuencia 0, 0, 2, 0, 1, 0 define la cara delantera izquierda: Los índices de vértice son 0, 2, y 1, y la textura de coordenadas índices son todos 0.
Aquí está el código para cargar la colección Faces:
pyramidMesh.getFaces (). addAll (0,0, 2,0, 1,0, // Frontal izquierdo face0,0, 1,0, 3,0, // face0,0 delantero derecho, 3,0, 4, 0, // face0,0 Atrás derecha, 4,0, 2,0, // face4,0 Volver a la izquierda, 1,0, 2,0, // face4,0 trasera inferior, 3,0, 1,0 / / la cara frontal inferior) -
Después de las tres colecciones de la malla están listos, el resto del código da cuerpo a la pirámide mediante la adición de un material de Phong, se traduce la pirámide para conseguir que fuera el centro de la escena, y añade la pirámide a la raíz:
Pirámide MeshView = new MeshView(pyramidMesh)-pyramid.setDrawMode(DrawMode.FILL)-pyramid.setMaterial(blueStuff)-pyramid.setTranslateX(200)-pyramid.setTranslateY(100)-pyramid.setTranslateZ(200)-root.getChildren().add(pyramid)-