2

在我的 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);
}

当矩阵堆栈只有这个矩阵时,此代码运行良好,但如果我推动先前的矩阵旋转(当然是前向和向上的向量旋转),它会失败。

我有什么错?

4

1 回答 1

1

当有更简单的方法时,为什么总是那些复杂的“我解决反向旋转并将其乘以模型视图”广告牌/冒名顶替解决方案?

令 M 为要确定广告牌矩阵的模型视图矩阵。矩阵是 4×4 实值类型。左上角的 3×3 定义了旋转和缩放。对于广告牌,这部分是身份。

因此,通过用身份替换当前模型视图矩阵的左上部分,并保持其余部分不变,即

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

并使用该矩阵进行进一步的转换,您将获得所需的效果。如果应用了缩放,则用缩放矩阵替换左上角的恒等式。

于 2012-10-16T12:19:26.630 回答