我已经尝试了几周,以便在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'位可以确保物体朝向它面向的方向移动,但我正在努力为相机找到这样的东西。
非常感谢任何帮助!
答案 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的任何本地属性(平移,旋转,缩放),则此方法可用于重新计算所有变换。