JavaFX: Adicionar um objeto de malha a um mundo 3D

Os objetos que você pode mais simplesmente adicionar ao seu mundo JavaFX virtuais são criadas usando os três built-in classes de forma 3D que vêm com JavaFX: Cilindro, Caixa, e Esfera. Para objetos mais complexos, você deve usar o TriangleMesh classe para criar o objeto baseado em uma série conectada de triângulos.

Aqui, criar um dos mais simples de todos os objetos de malha: a pirâmide de quatro lados retratado aqui. Visualmente, uma pirâmide de quatro lados tem um total de cinco rostos: as quatro faces laterais triangulares e a base quadrada. Mas em uma malha JavaFX triângulo, quadrados não são permitidos, apenas triângulos. Assim, a pirâmide, na verdade, é composto por seis faces, quatro faces laterais triangulares e dois triângulos adjacentes que formam a face.

Esta seção apresenta informações bastante conceitualmente difícil. Se você não estudou malhas em uma classe de Computação Gráfica, estar preparado para ler os parágrafos seguintes várias vezes antes que ele começa a fazer sentido.

Se ainda assim não faz sentido, pegue um latte, puxe uma folha de papel milimetrado, e começar a rabiscar. Desenhando a pirâmide com a sua própria mão vai ajudar o seu entendimento. Tente usar um lápis.

Uma pirâmide quadrado em JavaFX.
Uma pirâmide quadrado em JavaFX.

Para chegar a pirâmide começou, ligue para o TriangleMesh construtor como este:

TriangleMesh pyramidMesh = new TriangleMesh () -

Para completar a pirâmide, você precisa preencher três coleções que definem a geometria da malha. Essas coleções manter os pontos, os rostos, e as coordenadas de textura que definem a forma.

Comece com a textura coleção coordenar, porque você pode muito bem ignorá-lo por este simples pirâmide. coordenadas de textura são úteis quando você está usando um material que contém uma imagem que deve ser esticado de forma específica sobre a estrutura da malha. Eles permitem que você associar um x- específico, coordenada y na imagem com cada canto de cada face.

Infelizmente, você não pode simplesmente deixar de fora as coordenadas de textura, mesmo se você não precisa deles, então você deve carregar pelo menos uma coordenada. Fazer isso com esta linha de código:

. PyramidMesh.getTexCoords () addAll (0,0) -

Agora passar para as outras duas coleções. O próximo é uma coleção do vértices (Isto é, os cantos) que define a forma. Sua pirâmide quadrada tem cinco vértices, que você pode imaginar como o topo, no canto frontal (o ponto mais próximo de você), no canto esquerdo, no canto de volta, e no canto direito. Estes vértices são numerados de 0, 1, 2, 3, e 4.

Dada a altura h e o comprimento s de cada lado da pirâmide, você pode calcular o x, y, e z-coordenadas para cada vértice utilizando as seguintes fórmulas:

VérticeCantoxYZ
0Topo000
1Frente0h-s / 2
2Esquerda-s / 2h0
3Costass / 2h0
4Certo0hs / 2

Com tudo isso como pano de fundo, aqui está o código para criar a coleção Pontos:

flutuar h = 150 - // Heightfloat s = 300 -. // SidepyramidMesh.getPoints () addAll (0,0,0, // Ponto 0 - Top0, h, s / 2, // Ponto 1 - Front-s / 2, h, 0, // Ponto 2 - Lefts / 2, h, 0, // Ponto 3 - Back0, h, s / 2 // Ponto 4 - Direita) -

A colheita final define os rostos. Os rostos são definidas especificando o índice de cada vértice que compõe cada face. Por exemplo, a face frontal esquerda é um triângulo cujos vértices são três no topo, na parte da frente, e da esquerda. Os índices para estes três vértices são de 0, 2, e 1.

Há um total de seis triângulos na pirâmide, e os seus rostos são definidos pelos seguintes pontos:

Caraponto 1ponto 2ponto 3
Dianteiro esquerdo021
Frente direita013
traseira direita034
traseira esquerda042
parte inferior traseira412
frontal inferior432

Embora possa não ser evidente a partir desta tabela, a ordem em que aparecem as faces é crítica para o sucesso da malha. Em geral, as faces estão listados em um sentido anti-horário e ordem descendente. Assim, as quatro faces laterais embrulhar ao redor da pirâmide, a fim anti-horário. Eles são seguidos pelas duas faces inferiores.

Cada face na coleção enfrenta é representada por três pares de números, cada uma das quais representa o índice de um dos vértices do triângulo e o índice da textura correspondente de coordenadas.

Porque você tem apenas um item na textura coordenar a coleta, o segundo número em cada par será sempre zero. Assim, a seqüência 0, 0, 2, 0, 1, 0 define a face frontal esquerda: Os índices de vértices são 0, 2 e 1, ea textura coordenar índices são todos 0.

Aqui está o código para carregar a coleção Faces:

pyramidMesh.getFaces (). addAll (0,0, 2,0, 1,0, // frontal esquerda face0,0, 1,0, 3,0, // face0,0 dianteiro direito, 3,0, 4, 0, // face0,0 traseira direita, 4,0, 2,0, // face4,0 traseira esquerda, 1,0, 2,0, // face4,0 traseira inferior, 3,0, 1,0 / / face frontal inferior) - 

Após as três coleções da malha está pronto, o resto do código dá conta da pirâmide, adicionando um material Phong, traduz a pirâmide para tirá-lo do centro da cena, e adiciona a pirâmide para a raiz:

MeshView pirâmide = new MeshView(pyramidMesh)-pyramid.setDrawMode(DrawMode.FILL)-pyramid.setMaterial(blueStuff)-pyramid.setTranslateX(200)-pyramid.setTranslateY(100)-pyramid.setTranslateZ(200)-root.getChildren().add(pyramid)-

menu