ufk*_*ufk 4 c++ opengl math geometry normalization
任何人都可以协助我找到四元标准化的正确公式吗?
使用c ++和opengl.
谢谢!
小智 8
Newell的方法通常是计算近似平面的多边形法线的最佳选择.对于轻微的违规行为,它往往相当强大而不会太昂贵.请参阅Graphics Gems文章.它与上面描述的类似:
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) ;
Run Code Online (Sandbox Code Playgroud)
对于四边形来说,如果他们表现得相当好,可能不会有多大关系,但如果你处理更复杂的多边形,我肯定会使用它.
假设你想要一个四边形的法向量,这个伪代码就可以了
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
Run Code Online (Sandbox Code Playgroud)
这为您提供了公式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.
如果通过"四元标准化"你意味着别的东西,那就忽略这个答案.
编辑:我发现了这个相关的问题:获取多面体的表面积(3D对象)