Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从传感器类型_rotation_VECTOR获得的3D矩阵计算2D旋转(锁定一个轴旋转)_Android_3d_Opengl Es_2d_Android Sensors - Fatal编程技术网

Android 如何从传感器类型_rotation_VECTOR获得的3D矩阵计算2D旋转(锁定一个轴旋转)

Android 如何从传感器类型_rotation_VECTOR获得的3D矩阵计算2D旋转(锁定一个轴旋转),android,3d,opengl-es,2d,android-sensors,Android,3d,Opengl Es,2d,Android Sensors,我想建立一个应用程序,使用手机传感器融合旋转三维物体在OpenGL。但是我希望Z轴被锁定,因此我基本上希望对我的模型应用2D旋转 为了从3D矩阵构建2D旋转,我从SensorManager.getRotationMatrixFromVector()获取,如图所示,我为每个轴构建旋转矩阵: 我想应用2D旋转矩阵,它将是R=Ry*Rx,但这似乎不起作用。但应用R=Rz*Ry的效果与预期一样。我的猜测是Rx值不正确 要构建Rz,Ry,Rx矩阵,我查找了SensorManager.getOrienta

我想建立一个应用程序,使用手机传感器融合旋转三维物体在OpenGL。但是我希望Z轴被锁定,因此我基本上希望对我的模型应用2D旋转

为了从3D矩阵构建2D旋转,我从SensorManager.getRotationMatrixFromVector()获取,如图所示,我为每个轴构建旋转矩阵:

我想应用2D旋转矩阵,它将是
R=Ry*Rx
,但这似乎不起作用。但应用
R=Rz*Ry
的效果与预期一样。我的猜测是
Rx
值不正确

要构建
Rz
Ry
Rx
矩阵,我查找了
SensorManager.getOrientation()
用于计算角度的值:

values[0]=(float)Math.atan2(R[1],R[4]);
值[1]=(float)Math.asin(-R[7]);
值[2]=(float)Math.atan2(-R[6],R[8]);
下面是我如何为每个轴构建矩阵:

private val degConst=180/Math.PI
私有变量mTempRotationMatrix=MatrixCalculations.createUnit(3)
覆盖传感器更改的乐趣(事件:传感器事件?){
val传感器=事件?传感器?:返回
何时(传感器类型){
Sensor.TYPE_旋转_矢量->{
SensorManager.getRotationMatrixFromVector(mTempRotationMatrix,event.values)
val zSinAlpha=mTempRotationMatrix[1]
val zCosAlpha=mTempRotationMatrix[4]
val ySinAlpha=-mTempRotationMatrix[6]
val yCosAlpha=mTempRotationMatrix[8]
val xSinAlpha=-mTempRotationMatrix[7]
val xCosAlpha=MTEMP旋转矩阵[4]
val rx=矩阵计算。createUnit(3)
val ry=矩阵计算。createUnit(3)
val rz=矩阵计算。createUnit(3)
val sina=xSinAlpha
val cosa=xCosAlpha
val sinb=ySinAlpha
val cosb=yCosAlpha
val siny=zSinAlpha
val cosy=zCosAlpha
rx[4]=cosa
rx[5]=-新浪
rx[7]=新浪
rx[8]=cosa
ry[0]=cosb
ry[2]=sinb
ry[6]=-sinb
ry[8]=cosb
rz[0]=cosy
rz[1]=-siny
rz[3]=siny
rz[4]=舒适
val ryx=矩阵计算乘法(ry,rx)
mTempRotationMatrix=ryx
矩阵计算。副本(mTempRotationMatrix,mRenderer.rotationMatrix)
LOG.info(“产品:[“+mrender.rotationMatrix.joinToString”(“+”])”
val方向=浮动数组(3)
SensorManager.getOrientation(mTempRotationMatrix,方向)
日志信息(“偏航:“+orientation[0]*degConst+”\n\tpitch:“+orientation[1]*degConst+”\n\troll:“+orientation[2]*degConst”)
}
问题是我做错了什么,以及用什么值来表示
Rx
矩阵。我对这个问题的数学计算是否被打破了?另外有趣的是,我想知道
事件的值[3]
如何与
传感器管理器中的构建旋转矩阵相关。getRotationMatrixFromVector()

理论上,运行时,R=Ry*Rx应该给我正确的旋转,但事实并非如此