如何在LibGDX中正确旋转和移动三维透视相机



几周来,我一直在断断续续地尝试在LibGDX中正确处理对象和相机旋转。

在我的对象的自定义类中,我有下面的move和yrtate方法,"this"是一个ModelInstance:

public void move(float i) {
    // TODO Auto-generated method stub
    this.instance.transform.translate(0, 0, i);
    this.instance.calculateTransforms();
}
public void yrotate(float i) {
    // TODO Auto-generated method stub
    this.instance.transform.rotate(Vector3.Y, -i);
    this.instance.calculateTransforms();
}

这一切似乎都很好,因为我可以旋转对象并正确地在旋转的方向上移动它们(尽管我必须承认,我有点困惑于为什么Y向量必须是负的)。

我现在正试图为相机复制这个。我可以看到相机也有很多可用的方法,但它们与用于对象的方法并不完全匹配。目前我正在为相机做以下事情:

void move(float i) {
    // cam.translate(0, 0, i);
    cam.position.add(0, 0, i);
    cam.update();
}
void yrotate(float i) {
    cam.rotate(Vector3.Y, -i);
    // cam.direction.rotate(Vector3.Y, -i);
    cam.update();
}

上面的似乎是旋转和移动相机。然而,当移动相机时,位置x、y和z不考虑已经应用的旋转。

我认为,对于这些物体来说,"计算变换"的作用在于确保物体朝着它所面对的方向移动,但我很难为相机找到这样的东西。

如有任何帮助,我们将不胜感激!

如果你想把相机移到它正在观察的方向,那么你可以这样做:

private final Vector3 tmpV = new Vector3();
void move(float amount) {
    cam.position.add(tmpV.set(cam.direction).scl(amount));
    cam.update();
}

如果你出于某种原因不喜欢添加临时矢量,那么你可以在线缩放矢量:

void move(float a) {
    cam.position.add(cam.direction.x * a, cam.direction.y * a, cam.direction.z * a);
    cam.update();
}

顺便说一句,如果不修改节点,就不应该调用calculateTransforms。另请参阅文档:

如果修改了节点的任何局部属性(平移、旋转、缩放),则此方法可用于重新计算所有变换。

最新更新