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