c ++ opengl:如何找到四元组的规范化向量?

时间:2010-04-06 02:38:45

标签: c++ math opengl geometry normalization

任何人都可以协助我找到四元标准化的正确公式吗?

将c ++与opengl一起使用。

谢谢你!

2 个答案:

答案 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 + v3xv0vi=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)