我有来自 Android 设备 RotationVector 传感器 的方向值,以度数表示为偏航角、俯仰角和滚动角。我想根据这些方向值持续更新 LibGDX 透视相机旋转。我的目标是构建一个 3D 指南针。
在 render() 方法中我正在尝试:
@Override
public void render() {
ScreenUtils.clear(Color.BLACK, true);
// do some rendering
modelBatch.begin(cam);
modelBatch.render(instance, lights);
modelBatch.end();
// calculate/get the orientation angles
float Yaw = ...;
float Pitch = ...;
float Roll = ...;
// update camera orientation
cam.view.setFromEulerAngles(Yaw, Pitch, Roll);
cam.update();
}
我在 Android 设备方向变化的 logcat 中看到不断变化的偏航/俯仰/滚动值,但不幸的是我的模型(3D 指南针)不旋转。上面的代码有什么问题?为什么相机旋转不起作用?
这是因为您无法直接更新
view
的 PerspectiveCamera
,因为它会被对 update
的调用覆盖。
您可以通过修改
PerspectiveCamera
和 position
(或观察目标)来控制 direction
。
您需要根据滚动、偏航和俯仰计算新方向,然后将其设置在
camera
上。
仅供参考,这是
update
中PerspectiveCamera
的实现:
public void update(boolean updateFrustum) {
float aspect = this.viewportWidth / this.viewportHeight;
this.projection.setToProjection(Math.abs(this.near), Math.abs(this.far), this.fieldOfView, aspect);
this.view.setToLookAt(this.position, this.tmp.set(this.position).add(this.direction), this.up);
this.combined.set(this.projection);
Matrix4.mul(this.combined.val, this.view.val);
if (updateFrustum) {
this.invProjectionView.set(this.combined);
Matrix4.inv(this.invProjectionView.val);
this.frustum.update(this.invProjectionView);
}
}
注意,它会被覆盖
view
。
此答案仅适用于您确实使用
PerspectiveCamera
的情况。