任何人都可以协助我找到四元标准化的正确公式吗?
将c ++与opengl一起使用。
谢谢你!答案 0 :(得分:8)
Newell的方法通常是计算近似平面多边形法线的最佳选择。对于轻微的违规行为,它往往相当强大而不会太昂贵。请参阅Graphics Gems article。它与上述类似:
Vector3d normal(0,0,0) ;
for (int i=0; i<4; i++)
{
int j = (i+1)%4;
normal.x += (vertex[i].y - vertex[j].y)
*(vertex[i].z + vertex[j].z);
normal.y += (vertex[i].z - vertex[j].z)
*(vertex[i].x + vertex[j].x);
normal.z += (vertex[i].x - vertex[j].x)
*(vertex[i].y + vertex[j].y);
}
normalize (normal) ;
如果他们表现得相当好,那对于四边形来说可能并不重要,但如果你处理更复杂的多边形,我肯定会使用它。
答案 1 :(得分:6)
假设你想要一个四边形的法向量,这个伪代码可以工作
Vector3d vertex[4] = { ... }
Vector3d normal(0,0,0) ;
for (int i=0; i<4; i++)
{
normal += cross (vertex[i], vertex[(i+1)%4]) ; // cross product
}
normalize (normal) ;
// normal is the unit normal to the quad
这为您提供了公式n=A/|A|
,其中A = v0xv1 + v1xv2 + v2xv3 + v3xv0
和vi=vertex[i]
)。 |A|/2
也是多边形的区域。这可以推广到任意多边形,甚至可以为非平面多边形提供合理的结果,只要它们不是非平面的。
一个参考是http://softsurfer.com/Archive/algorithm_0101/algorithm_0101.htm
如果您知道四边形/多边形是平面的,则只需计算前三个顶点形成的三角形的法线。这是A1/|A1|
,其中A1 = (v1-v0)x(v2-v0) = v0xv1 + v1xv2 + v2xv0
。
如果通过“四元标准化”你意味着别的东西,那就忽略这个答案。
编辑:我发现了这个相关的问题:Get the Surface Area of a Polyhedron (3D object)