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

Posted

技术标签:

【中文标题】使用 OpenGL 定向图形以查看相机【英文标题】:Orientating Figures to look at the Camera with OpenGL 【发布时间】:2012-10-16 08:19:31 【问题描述】:

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

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

我有什么错?

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

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

以上是关于使用 OpenGL 定向图形以查看相机的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL定向照明+定位

OpenGL - 如何跟踪移动的物体? [关闭]

OpenGL相机移动程序顶点着色器问题

在opengl中翻译相机有问题

如何让相机跟随opengl中的3d对象?

OpenGl 坐标转换