gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:37:15 25 4
gpt4 key购买 nike

为了正确处理 LibGDX 中的对象和相机旋转,我已经断断续续地尝试了几周。

我的对象的自定义类中有以下移动和旋转方法,“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 vector 必须为负)。

我现在正在尝试为相机复制这一点。我可以看到相机也有很多可用的方法,但它们与用于对象的方法并不完全匹配。目前我正在为相机执行以下操作:

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”位发挥了魔力,确保对象朝其面向的方向移动,但我正在努力为相机找到类似的东西。

任何帮助将不胜感激!

最佳答案

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

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

如果您出于某种原因不喜欢添加临时 vector ,那么您可以内联缩放 vector :

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

顺便说一句,如果您没有修改节点,则不应调用 calculateTransforms。另请参阅the documentation :

This method can be used to recalculate all transforms if any of the Node's local properties (translation, rotation, scale) was modified.

关于java - 如何在 LibGDX 中正确旋转和移动 3D 透视相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38777884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com