gpt4 book ai didi

android - 如何使用 Android 指南针方向瞄准 opengl 相机?

转载 作者:太空狗 更新时间:2023-10-29 12:57:07 26 4
gpt4 key购买 nike

我正在使用 libgdx 为 android 开发一个基本的 3d 游戏,并且在给定罗盘提供的三个旋转角度(方位角 - 绕 Z 旋转,滚动 - 绕 Y 旋转,俯仰 - 旋转)的情况下,我很难正确定位相机关于 X)。我使用以下代码取得了一些成功,因为我可以按照预期将虚拟相机正确地对准 Z 轴和 X 轴。 (角度以度为单位 [-180,180])

camera.direction.x = 0;
camera.direction.y = 0;
camera.direction.z = 1;
camera.up.x = -1;
camera.up.y = 0;
camera.up.z = 0;

camera.rotate(azimuth,0,0,1);
camera.rotate(roll,0,1,0);
camera.rotate(pitch,1,0,0);

我在这方面也取得了一些成功,但它并没有定向相机的向上矢量。 (此版本中角度已转换为弧度)

float x,y,z;
roll = (float) (roll + Math.PI/2.0);
x = (float) (Math.cos(azimuth) * Math.cos(roll));
y = (float) (Math.sin(azimuth) * Math.cos(roll));
z = (float) (Math.sin(roll));
Vector3 lookat = new Vector3(x,y,z);
camera.lookAt(lookat.x, lookat.y, lookat.z);

有人可以阐明如何从这三个角度正确定位虚拟相机吗?

另外,我试图让手机处于横向模式,这样手机的顶部在左边,底部在右边。因此,相机的默认方向(所有旋转都为 0,手机顶部指向北方)是相机瞄准地面(正 Z)和向上瞄准东方(负 X)。

最佳答案

通过编写其他代码一段时间,我最终达到了尝试分离渲染、模拟和输入的地步。因此,我想出了以下适合我的解决方案。我没有对其进行严格测试,但它似乎可以满足我的要求(忽略相机胶卷)

在程序的 android 部分,我需要将方向设置为横向模式:

<activity android:name=".MySuperAwesomeApplication"
android:label="@string/app_name"
android:screenOrientation="landscape">
>

我创建了一个播放器类来存储偏航、俯仰、滚动和位置

public class Player {
public final Vector3 position = new Vector3(0,1.5f,0);
/** Angle left or right of the vertical */
public float yaw = 0.0f;
/** Angle above or below the horizon */
public float pitch = 0.0f;
/** Angle about the direction as defined by yaw and pitch */
public float roll = 0.0f;
}

然后当我根据输入更新播放器时,我执行以下操作:

player.yaw = -Gdx.input.getAzimuth();
player.pitch = -Gdx.input.getRoll()-90;
player.roll = -Gdx.input.getPitch();

请注意,pitch 映射到 input.roll,roll 映射到 input.pitch。不知道为什么,但它对我有用。最后更新相机:

camera.direction.x = 0;
camera.direction.y = 0;
camera.direction.z = 1;
camera.up.x = 0;
camera.up.y = 1;
camera.up.z = 0;
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 0;
camera.update();

// The world up vector is <0,1,0>
camera.rotate(player.yaw,0,1,0);
Vector3 pivot = camera.direction.cpy().crs(camera.up);
camera.rotate(player.pitch, pivot.x,pivot.y,pivot.z);
camera.rotate(player.roll, camera.direction.x, camera.direction.y, camera.direction.z);
camera.translate(player.position.x, player.position.y, player.position.z);
camera.update();

编辑:在代码中添加了相机胶卷。对于我和我的 Droid 2,roll 似乎只有 [-90,90] 中的值,这样如果你旋转超过 -90 或 90,值开始变回 0。

关于android - 如何使用 Android 指南针方向瞄准 opengl 相机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5274514/

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