C++ 使用OpenGL定向图形以查看相机

C++ 使用OpenGL定向图形以查看相机,c++,opengl,matrix,C++,Opengl,Matrix,在我的opengl应用程序中,我想定位图形以查看相机,为此,我为所有对象定义了2个向量,前面和上面 我用gluLookAt控制摄像机,所以我需要的矢量newFront和newUp很容易知道 我用于控制每个图形的方向的代码是: m4D orientate(v3D newFront, v3D newUp) { double angle = angle_between(front, newFront); v3D cross = normalize(cross_product(front

在我的opengl应用程序中,我想定位图形以查看相机,为此,我为所有对象定义了2个向量,前面和上面

我用gluLookAt控制摄像机,所以我需要的矢量newFront和newUp很容易知道

我用于控制每个图形的方向的代码是:

m4D orientate(v3D newFront, v3D newUp)
{
    double angle = angle_between(front, newFront);
    v3D cross = normalize(cross_product(front, newFront));

    m4D matrix = rotate_from_axis(angle, cross);

    up = normalize(up * matrix);

    angle = angle_between(up, newUp);
    cross = normalize(cross_product(up, newUp));

    return(rotate_from_axis(angle, cross) * matrix);
}
当矩阵堆栈只有这个矩阵时,这段代码运行良好,但是如果我推动前面的矩阵旋转(当然是前向和上向向量旋转),它将失败


我的错在哪里?

为什么有更简单的方法时,总是使用那些复杂的“我求解逆旋转并将其乘以modelview”的公告牌/视点替用画解决方案

设M为模型视图矩阵,从中确定广告牌矩阵。矩阵是4×4实值类型。左上角的3×3定义了旋转和缩放。对于广告牌来说,这一部分是标识

因此,用identity替换当前modelview矩阵的左上部分,并保持其余部分不变,即

 1  0  0 tx
 0  1  0 ty
 0  0  1 tz
wx wy wz ww

使用该矩阵进行进一步的变换,可以得到理想的效果。如果应用了缩放,请用缩放矩阵替换左上角的标识。

非常感谢DatenWalf,我怀疑复杂解决方案的原因与设计的图形引擎有关。实现你的解决方案迫使我完全控制矩阵变换(而不是像现在这样部分控制)。它有效!!,只有一个提示(我不知道是否需要提出新问题),?我的代码是否适合选择任意的前向向量和上向向量?@ergocortex:即使这样也可以写得更简单。矩阵的第二行有时称为“向上”,第三列称为“前”向量。第一列应设置为它们之间的叉积。如果将齐次变换矩阵的前3列视为坐标系的基向量,将第4列视为原点,则最容易理解。感谢@datenwolf的解释。很有启发性。