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 - 我希望相机更接近物体,如何?的主要内容,如果未能解决你的问题,请参考以下文章