我创建了一个网格锥:
点数如此:
p3
/
/
p1 ---- p2
我计算u = p2 - p1,v = p3 - p1 然后取出交叉乘积u X v并在进行透视投影之前对矢量进行标准化。但无论我用哪种方式计算u和v(例如u = p2-p1,v = p3-p2),我的法线总是面向锥体的内部。
我在这里看了很多其他例子,但似乎都没有。
有什么建议吗?
编辑 - 这就是我得到的:
我通过矢量计算器运行数字,所有计算都是正确的。
其中一架飞机:
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;
答案 0 :(得分:2)
简单的答案是在交叉产品中切换u和v,但我想你的问题就像“我如何确定我是否只是按照正确的方向计算法线”?这应该通过逆时针保存顶点来确定。
我在计算中看不到错误,但你的绘图看起来并不像法线。这不仅仅是关于法线的标志,而是你似乎总是指向锥形地面的中心。
如果没有看到实际的代码,我真的不能再说了。你的所有“法线”实际上都指向一个点吗?