Android 如何从传感器类型_rotation_VECTOR获得的3D矩阵计算2D旋转(锁定一个轴旋转)
我想建立一个应用程序,使用手机传感器融合旋转三维物体在OpenGL。但是我希望Z轴被锁定,因此我基本上希望对我的模型应用2D旋转 为了从3D矩阵构建2D旋转,我从SensorManager.getRotationMatrixFromVector()获取,如图所示,我为每个轴构建旋转矩阵: 我想应用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
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应该给我正确的旋转,但事实并非如此