我使用等效于gluLookAt的Qt来设置视图矩阵,我一直在通过在场景中各处平移它来移动它。。现在我想用相机靠近一个物体。
我知道物体的位置,无论是在物体坐标系中还是在其他坐标系中(我有该物体的模型矩阵),但如何获得相机的位置?
为了使相机的动画越来越接近物体,我想我应该拿两点:
- 对象所在的点
- 相机所在的点
然后做一些类似的事情
QVector3D direction_to_get_closer = point_where_object_is - point_where_camera_is
我如何找到相机所在的位置?或者,如果不需要这样做,我如何使向量指向相机必须遵循的方向(没有旋转,我只需要平移,这会简化事情)以到达对象?
gluLookAt(eye,target,headUp)采用三个参数,即相机/眼睛的位置、要查看的对象的位置,以及控制滚动/抬头方向的单位向量。
要放大,可以将眼睛/相机位置移动矢量方向的一小部分_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,则摄影机变换将中断。
如果不需要缩放,平移/旋转新的"缩放"点_where_camera_is的更好方法是在到个位置之间进行插值。
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的起始位置;