ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-12-08 17:28:20  阅读:310  来源: 互联网

标签:3d opengl-es libgdx android


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

请注意,音高映射到input.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.

标签:3d,opengl-es,libgdx,android
来源: https://codeday.me/bug/20191208/2092909.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有