在OpenGL中绘制对象以使其面向法线

时间:2012-06-06 17:35:14

标签: math opengl 3d

我试图在几何面上,在脸的中心并指向正常的方向上绘制普通手柄(到目前为止一个高大的矩形形状)。

我正在使用以下代码:

Vec3 up(0.0, 1.0, 0.0);
Vec3 angle_to_rotate = up.cross(face_normal);
double dot = up.dot(normal);
float rotate_angle = std::acos(dot);

Mat4 matrix;
matrix.translate(face_center.x, face_center.y, face_center.z);
matrix.rotate(angle_to_rotate, rotate_angle);

glMultMatrixd(matrix.copyGL());

然后我在世界空间画了一个高大的立方体(y up)。

这有时可以正常工作,但有时候(二维45个角度)失败,或角度方向正确,但矩形看起来像是在z轴上旋转而没有对齐。

在OpenGL中实现与(与未来垂直)绘图对象的正确方法是否正确?还是有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

两个归一化向量的叉积本身未标准化。矢量的长度实际上是旋转角度的正弦。

您可以使用它来获得更准确的角度值:

Vec3 axis = up.cross(face_normal);
float angle = std::atan2(axis.length(), up.dot(face_normal));
axis = axis.normalize();