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

时间:2017-11-10 07:12:56

标签: math graphics 3d normals

我创建了一个网格锥:

enter image description here

点数如此:

    p3
   /   
  /
 p1 ---- p2

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

我在这里看了很多其他例子,但似乎都没有。

有什么建议吗?

编辑 - 这就是我得到的:

enter image description here

我通过矢量计算器运行数字,所有计算都是正确的。

其中一架飞机:

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;

1 个答案:

答案 0 :(得分:2)

简单的答案是在交叉产品中切换u和v,但我想你的问题就像“我如何确定我是否只是按照正确的方向计算法线”?这应该通过逆时针保存顶点来确定。

看到你的编辑后:

我在计算中看不到错误,但你的绘图看起来并不像法线。这不仅仅是关于法线的标志,而是你似乎总是指向锥形地面的中心。

如果没有看到实际的代码,我真的不能再说了。你的所有“法线”实际上都指向一个点吗?