横屏问题
近期开发遇到个横屏问题.我们需要使用手机IMU返回的旋转矩阵作为OpenGL里的视图矩阵使用.竖屏时还好.没有多想直接传给native层赋值就可以.
横屏后出现上下左右颠倒的问题.概述一下就是,原矩阵代表的摄像机坐标系是这样的:
|y
|
|-------x
/
/z
y为屏幕上方向,x为屏幕右反向,z为屏幕朝里.
当手机横屏倒过来了,当机身和地面垂直,机身保持水平不变时,IMU返回的矩阵可以用以下坐标系表示:
|x
|
|
y-------
/
/
/z
但是OpenGL使用的视图矩阵代表的坐标系还是第一个,也就是我们需要把新坐标系下的x轴 -y 轴对调.z轴不变.一种方法是直接换轴.根据理解矩阵(一) - 孟岩 - 博客频道 - CSDN.NET的表述,直接把旋转矩阵中代表x轴,-y轴的两个向量互换就行.
另一种理解是将该坐标系绕z轴旋转90度即可.以R表示旋转变换矩阵,那么在OpenGL中用R左乘视图矩阵即可得到旋转矫正后的摄像机坐标系.即:
M′view=R⋅Mview
关于左乘和右乘
这里摘自第二篇引用文章.
左乘(left multiplication, pre-multication)和右乘(right multiplication, post-multication),这里的左右、pre/post,指的是矢量和矩阵相乘时,矢量的位置。对标量和矩阵相乘时,指标量的位置。
说简单点,左乘(又称前乘)就是乘在左边(即乘号前),右乘(又称后乘)就是乘在右边(即乘号后).
所以想法很简单,就是让坐标系绕自身z轴旋转90度就行,但是调了很久都没弄出来.遇到的挫折就不说了.最后不算了重新找资料发现其