确定JavaFX和Point3D中的顶点绕组(用于背面剔除)

时间:2017-02-28 16:47:04

标签: java javafx 3d java-3d culling

我正在将J3d GeometryArrays显示为JavaFX中的TriangularMeshes。我知道我收到的GeometryArrays是TriangleStripArrays,顺序允许我构建正确的面并在场景中显示网格。

但是,我对如何根据TriangleStripArray单独确定顶点绕组顺序感到茫然。这些面目前没有正确的背面剔除概念,留下了一个完整的TriangleMesh,从任何给定的角度看都是扭曲的。通过将CullFaceMode从BACK更改为NONE,并通过在场景中绘制顶点,我可以看出所有面都被正确映射,只是剔除不一致。

我有两种方法可以从包含3个顶点的任何给定三角形面构建TriangleMesh,一个用于CW绕组,一个用于CCW。

本质:

float[] points = {v1.x, v1.y, v1.z, v2.x, v2.y, v2.z, v3.x, v3.y, v3.z};
float[] texCoords = {1, 1, 1, 0, 0, 1};
int[] faces = new int[]{0, 0, 1, 1, 2, 2};

VS

float[] points = {v2.x, v2.y, v2.z, v1.x, v1.y, v1.z, v3.x, v3.y, v3.z};
float[] texCoords = {1, 0, 1, 1, 0, 1};
int[] faces = new int[]{0, 0, 1, 1, 2, 2};

我的问题是,如何根据TriangleStripArray单独确定顶点绕组顺序以及每个面应使用哪种方法? (TexCoordinates正在提供,但未使用)

提前致谢! - R. Melville

1 个答案:

答案 0 :(得分:0)

如果a,b和c是三角形的顶点,可以通过计算向量(b-a)x(c-y)的叉积来解决这个问题。

我们来自Math-Stackoverflow的朋友有更详细的解释:-) why-does-cross-product-tell-us-about-clockwise-or-anti-clockwise-rotation