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

时间:2016-08-04 21:43:10

标签: java opengl 3d libgdx

我已经尝试了几周,以便在LibGDX中正确处理对象和相机旋转。

我在我的对象的自定义类中有以下move和yrotate方法,'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。

我在想,对于对象来说,'calculateTransforms'位可以确保物体朝向它面向的方向移动,但我正在努力为相机找到这样的东西。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

如果您想将相机移动到它正在查看的方向,那么您可以这样做:

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。另请参阅the documentation

  

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

相关问题