使用 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 定向图形以查看相机的主要内容,如果未能解决你的问题,请参考以下文章