我在做一个2d游戏。手机是水平拿着的,角色会上下左右移动以避开障碍物。角色由手机上的加速计控制。如果玩家不介意(0,0) (角色静止的地方)是在手机完全平放的时候,一切都很好。在这种情况下,可以直接读取Y和X值并使用它们来控制角色。加速度计的值介于-10和10之间(它们与加速度常数相乘,以确定角色的移动速度),libgdx是使用的框架。
问题是使用(0,0)不是很舒服,所以我们的想法是校准它,以便在特定的时间点将0,0设置为手机的位置。
这就引出了我的问题,我该怎么做呢?我试着只读取当前的X和Y值,然后减去它。这样做的问题是,当手机保持90度角时,X偏移值是10 (这是最大值),因此它最终变得不可能移动,因为该值永远不会超过10 (10-10 = 0)。Z轴必须以某种方式在这里发挥作用,我只是不确定如何。
谢谢你的帮助,我尽我所能地解释,我确实试着寻找解决方案,但我甚至不知道我正在寻找的东西的合适术语是什么。
发布于 2014-03-06 21:27:34
这是一个老问题,但我在这里提供了答案,因为我找不到适用于安卓或LibGDX anywhere的好答案。下面的代码是基于某人为iOS发布的解决方案(抱歉,我丢失了参考)。
您可以通过以下三个部分完成此操作:
Vector3 tiltCalibration = new Vector3( Gdx.input.getAccelerometerX(),Gdx.input.getAccelerometerY(),Gdx.input.getAccelerometerZ() );
public void initTiltControls( Vector3 tiltCalibration ){ Vector3.tmp.set( 0,0,1 );Vector3.tmp2.set( tiltCalibration ).nor();四元数rotateQuaternion =新的四元数().setFromCross( Vector3.tmp,Vector3.tmp2 );Matrix4 m=新的Matrix4( Vector3.Zero,rotateQuaternion,新的Vector3( 1f,1f,1f ) );this.calibrationMatrix = m.inv();}
public void handleAccelerometerInputs( float x,float y,float z){ Vector3.tmp.set( x,y,z );Vector3.tmp.mul( this.calibrationMatrix );x= Vector3.tmp.x;y= Vector3.tmp.y;z= Vector3.tmp.z;在这里使用x,y和z ... }
发布于 2012-03-15 06:19:15
对于简单的解决方案,您可以查看以下方法:
Gdx.input.getAzimuth(), Gdx.input.getPitch(), Gdx.input.getRoll()缺点是,与北/南/东/西相比,它们以某种方式使用内部指南针来给你的设备提供旋转。我只是在很短的时间内测试了它,所以我不是100%确定它。可能值得一看。
更复杂的方法涉及一些三角函数,基本上你必须从Gdx.input.getAccelerometerX/Y/Z()计算手机的角度。必须类似于(用于沿手机较长的一侧旋转):
Math.atan(Gdx.input.getAccelerometerX() / Gdx.input.getAccelerometerZ());对于这两种方法,您都可以存储初始角度,并在以后再次减去它。不过,你必须注意范围,我认为Math.atan(...)在-Pi和Pi之间。
希望这能让你以某种方式开始。你也可以搜索“加速度计到俯仰/滚动/旋转”或者类似的词。
https://stackoverflow.com/questions/9705446
复制相似问题