Math 在OpenGL中以与面法线对齐的方式绘制对象

Math 在OpenGL中以与面法线对齐的方式绘制对象,math,opengl,3d,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, fa

我正在尝试在几何体面上绘制一个高矩形的法线手柄,在面的中心,指向法线

我正在使用以下代码执行此操作:

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向上画了一个高大的立方体


这有时可以正常工作,但有时在二维中45个角度失败,或者角度方向正确,但矩形看起来像是在z轴上旋转的,并且没有正确对齐


这是实现图形对象对齐的正确方法吗?将来可能会垂直于OpenGL中的太法线,还是有更好的方法?

两个规范化向量的叉积本身不会规范化。向量的长度实际上是旋转角度的正弦

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

Vec3轴=向上。十字面_法线; 浮动角度=标准::atan2axis.length,up.dotface_normal; axis=axis.normalize;
看起来像是在z轴上旋转,并且没有正确对齐:您有指向屏幕截图的链接吗?