openGL - 我希望相机更接近物体,如何?

Posted

技术标签:

【中文标题】openGL - 我希望相机更接近物体,如何?【英文标题】:openGL - I want the camera to get closer to the object, how? 【发布时间】:2012-07-22 10:19:55 【问题描述】:

我使用与 gluLookAt 等效的 Qt 来设置我的视图矩阵,我一直在通过在场景中的任何地方平移它来移动它。现在我想用相机靠近一个物体。

我知道对象的位置,包括对象坐标和相互坐标(我有该对象的模型矩阵),但是如何获取相机的位置?

为了让相机越来越接近物体,我想我应该采取两点:

对象所在的点 相机所在的点

然后做类似的事情

QVector3D direction_to_get_closer = point_where_object_is - point_where_camera_is

如何获得相机所在的位置?或者,如果不需要,我如何将向量指向相机必须遵循的方向(没有旋转,我只需要平移,这将简化事情)以到达对象?

【问题讨论】:

【参考方案1】:

gluLookAt(eye, target, headUp) 采用三个参数,相机/眼睛的位置,您要查看的对象的位置,以及控制滚动/抬头方向的单位向量。

要放大更近,您可以将眼睛/相机位置移动矢量 direction_to_get_closer 的一部分。例如,

point_where_camera_is += 0.1f * direction_to_get_closer; // move 10% closer

以恒定的量而不是当前距离的 10% 移动更有用(否则当距离很大时你会移动得非常快,然后会越来越慢)。因此,您应该使用归一化方向:

 QVector3D unitDir = direction_to_get_closer.normalized();
 point_where_camera_is += 0.1f * unitDir; // move 0.1 units in direction

如果 point_where_camera_is 等于 point_where_object_is,相机变换将中断。

更好的方法是,如果您不需要缩放,平移/旋转新的“缩放”point_where_camera_is 是在 to 位置之间进行插值。

float t = some user input value between 0 and 1 (0% to 100% of the line camToObj)
QVector3D point_on_line_cam_obj = t * point_where_camera_is + (1-t) * point_where_object_is;

这样,你可以通过限制t来阻止用户放大物体,也可以回到t=0的起始位置;

【讨论】:

以上是关于openGL - 我希望相机更接近物体,如何?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL试图翻译物体,但相机也翻译,我不需要

如何让物体跟随相机?

物体在相机周围保持距离c ++ opengl

如何最好地接近局部阈值opengl函数

在 OpenGL 场景中绕物体旋转的困难

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