计算三角形法线的问题

时间:2017-04-26 00:47:08

标签: java 3d lwjgl

我正在渲染一些基本的三角形,我正在代码中生成法线。这是我的“计算法线”方法。它从三个顶点得到三角形的面法线:

public static Vector3f calculateNormal(Vector3f v0, Vector3f v1, Vector3f v2) {
    Vector3f u = Vector3f.sub(v2, v0, null);
    Vector3f w = Vector3f.sub(v1, v0, null);

    Vector3f n = new Vector3f();
    Vector3f.cross(u, w, n);
    n.normalise(n);

    if (Float.isNaN(n.x) || Float.isNaN(n.y) || Float.isNaN(n.z)) {
        System.out.println("It's NaN!");
        return new Vector3f(0,1,0);
    }

    return n;
}

除了输出大约一半三角形的“NaN”。我尝试切换顶点的顺序,但没有做任何事情。

2 个答案:

答案 0 :(得分:2)

您的DELETED功能对我来说没问题:)

但是,具有NaN法线的三角形可能具有共线顶点(即,它们是退化的三角形)。尝试检查calculateNormal是否为零(或几乎为零)以检测此边缘情况。

答案 1 :(得分:-2)

在不知道您使用的是哪个数学库的情况下,我无法专门回答。但是,要找到具有3个点的叉积,您需要找到从一个点到另外两个点的矢量。

Vector3f toPoint2 = point2 - point1;
Vector3f toPoint3 = point3 - point1;

一旦有了两个向量,就需要找到它们的叉积,它与toPoint2toPoint3正交。为了找到叉积,找到以下矩阵的确定:

[i          j          k         ]
[toPoint2.x toPoint2.y toPoint2.z]
[toPoint3.x toPoint3.y toPoint3.z]

交叉产品是:

Vector3f vec = new Vector3f(toPoint2.y * toPoint3.z - toPoint2.z * toPoint3.y, toPoint2.z * toPoint3.x - toPoint2.x * toPoint3.z, toPoint2.x * toPoint3.y - toPoint2.y * toPoint3.x)

此叉组产品将生成point1point2point3的法线向量。