计算网格锥平面的外表面法线

Calculating the outward surface normal of a mesh cone plane

我创建了一个网格锥体:

具有这样定向的点:

    p3
   /   
  /
 p1 ---- p2

我已经计算出 u = p2 - p1, v = p3 - p1 然后取叉积 u X v 并在进行透视投影之前对向量进行归一化。但无论我用哪种方式计算 u 和 v(例如 u = p2 - p1,v = p3 - p2),我的法线总是面向圆锥体的内部。

我在这里查看了许多其他示例,但其中 none 似乎有效。

有什么建议吗?

编辑 - 这就是我得到的:

我已经 运行 通过向量计算器计算了这些数字,所有的计算都是正确的。

其中一架飞机:

P1x: 0.866025
P1y: -0.500000
P1z: 9.000000

P2x: 0.939693
P2y: -0.342020
P2z: 9.000000

P3x: 0.000000
P3y: -0.000000
P3z: 10.000000

Vector U: 0.073667, 0.157980, 0.000000
Vector V: -0.866025, 0.500000, 1.000000
Normal: 0.157980, -0.073667, 0.173648

我计算u、v、n的代码是:

            //u = p2 - p1
            vecU.m[1][1] = p2.m[1][1] - p1.m[1][1];
            vecU.m[2][1] = p2.m[2][1] - p1.m[2][1];
            vecU.m[3][1] = p1.m[3][1] - p1.m[3][1];
            vecU.m[4][1] = 1;

            printf("Vector U: %f, %f, %f\n", vecU.m[1][1], vecU.m[2][1], vecU.m[3][1]);

            //v = p3 - p1
            vecV.m[1][1] = p3.m[1][1] - p1.m[1][1];
            vecV.m[2][1] = p3.m[2][1] - p1.m[2][1];
            vecV.m[3][1] = p3.m[3][1] - p1.m[3][1];
            vecV.m[4][1] = 1;

            printf("Vector V: %f, %f, %f\n", vecV.m[1][1], vecV.m[2][1], vecV.m[3][1]);

            //n = u X v
            vecN.m[1][1] = (vecU.m[2][1] * vecV.m[3][1]) - (vecU.m[3][1] * vecV.m[2][1]);
            vecN.m[2][1] = (vecU.m[3][1] * vecV.m[1][1]) - (vecU.m[1][1] * vecV.m[3][1]);
            vecN.m[3][1] = (vecU.m[1][1] * vecV.m[2][1]) - (vecU.m[2][1] * vecV.m[1][1]);
            vecN.m[4][1] = 1;

简单的答案是在叉积中交换 u 和 v,但我猜你的问题更像是 "how do I determine if i just calculated the normal in the correct direction"?这应该通过逆时针保存顶点来确定。

看到您的编辑后:

我看不出你的计算有误,但你的画看起来一点也不像法线。这不仅仅是关于法线的符号,而是你似乎总是指向圆锥体表面的中心。

没有看到实际的代码,我真的不能再多说了。你所有的 'normals' 实际上都指向一个点吗?