java - 计算一个简单三角形的每面法线

标签 java opengl opengl-es 3d libgdx

我一直在搞一些 3D 的东西(更具体地说是 LibGdx,但这对这个问题来说无关紧要),最近我发现了一个问题,试图计算一个简单三角形的每面法线。< br/> 我生成的三角形网格具有以下顶点(也显示在下面的链接中):

v0 = [3 , 0 , 0]//X, Y, Z
v1 = [1.49 , 0.86 , 0]//X, Y, Z
v2 = [3 , 0 , -1]//X, Y, Z

为了计算该三角形网格的面法线,我使用了一个可以在许多教程/示例网站中找到的函数(稍作修改):

private Vector3 calculateNormal(float vX1, float vY1, float vZ1,
                                float vX2, float vY2, float vZ2,
                                float vX3, float vY3, float vZ3) {

        Vector3 edge1 = new Vector3(vX1, vY1, vZ1).sub(vX2, vY2, vZ2);
        Vector3 edge2 = new Vector3(vX2, vY2, vZ2).sub(vX3, vY3, vZ3);

        Vector3 crsProd = edge1.crs(edge2); // Cross product between edge1 and edge2

        Vector3 normal = crsProd.nor(); // Normalization of the vector

        return normal;
}

将构成三角形的 3 个顶点的值传递给此方法后,我得到了以下结果:

[-0.49, -0.86, 0.0]

Representation of the Triangle Mesh and the Normal Vector (Image)

问题 1:
根据我的阅读,我认为该三角形的计算法线值不正确。我的猜测是法线应该位于垂直于三角形中心的某个位置(X 应该是正值,Z 应该是负值)。

问题 2:
在计算出三角形的每面法线后,三角形的所有顶点是否应该具有相同的每面法线值,如下所示:

verticesArr[v0Idx + 0] = 3;//位置
verticesArr[v0Idx + 1] = 0;//位置
verticesArr[v0Idx + 2] = 0;//位置
verticesArr[v0Idx + 3] = -0.49;//法线X
verticesArr[v0Idx + 4] = -0.86;//正常Y
verticesArr[v0Idx + 5] = 0;//正常Z

verticesArr[v1Idx + 0] = 1.49;//位置
verticesArr[v1Idx + 1] = 0.86;//位置
verticesArr[v1Idx + 2] = 0;//位置
verticesArr[v1Idx + 3] = -0.49;//法线X
verticesArr[v1Idx + 4] = -0.86;//正常Y
verticesArr[v1Idx + 5] = 0;//正常Z

verticesArr[v2Idx + 0] = 3;//位置
verticesArr[v2Idx + 1] = 0;//位置
verticesArr[v2Idx + 2] = -1;//位置
verticesArr[v2Idx + 3] = -0.49;//法线X
verticesArr[v2Idx + 4] = -0.86;//正常Y
verticesArr[v2Idx + 5] = 0;//正常Z

我问第二个问题是因为我看过教程和示例,其中为三角形的每个顶点显示了不同的垂直法 vector (用于计算每个面的法线而不是每个顶点的法线)。

最佳答案

问题 1:法线没有位置。它们是垂直于由三角形的任意两个 vector 的方向组合创建的平面的 vector 的方向。

问题 2:三角形的所有顶点都应该具有相同的法线,因为它们属于同一平面,即三角形的平面。

Normal

如您所见,无论您在三角形上的哪个位置,法 vector 的方向都是相同的。

关于java - 计算一个简单三角形的每面法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389335/

相关文章:

java - OpenGL ES 2.0 和 OpenGL ES 3.0 的单一代码

java - 如何在 ListView 中显示firebase数据?

java - 指定 IBatis 查询超时

java - com.fasterxml.jackson.core.JsonParseException : Unrecognized token

linux - 如何知道 opengl 函数是否会阻塞?

ios - CADisplayLink 导致 touchesBegan 和 touchesEnded 之间存在延迟?

java - Eclipse 3.6 Tomcat 不会将部署程序集中的 jar 放到它的部署 tmp 目录中

java - 在片段着色器中更改 OpenGL 中纹理的颜色不太有效

c++ - 在 OpenGL 立方体上显示多个纹理,c++ GLFW

ios - 在OpenGL的类中更改C结构的值- objective-c