首页 文章

如何使用Android罗盘方向瞄准opengl相机?

提问于
浏览
3

我正在使用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) .

1 回答

  • 3

    通过编写其他东西一段时间,我最终达到了一个点,我试图分离渲染,模拟和输入 . 因此,我提出了以下适用于我的解决方案 . 我没有严格测试它,但它似乎做我想要的(忽略相机胶卷) .

    在程序的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();
    

    请注意,音高映射到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,滚动似乎只有[-90,90]中的值,这样如果您旋转超过-90或90,则值开始向0变回 .

相关问题