计算网格锥平面的外表面法线
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' 实际上都指向一个点吗?
我创建了一个网格锥体:
具有这样定向的点:
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' 实际上都指向一个点吗?