1

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

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

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

  • 物体所在的点
  • 相机所在的位置

然后做类似的事情

QVector3D direction_to_get_closer = point_where_object_is - point_where_camera_is

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

4

1 回答 1

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 时回到起始位置;

于 2012-07-22T12:14:06.160 回答