简单VR照⽚使⽤陀螺仪、姿态⾓(Roll、Pitch、Yaw)、四元
数
最近在做⼀个类似VR照⽚的demo,跟全景图⽚也很像,只是VR照⽚与全景720度显⽰,我只做了180度。但我发现他们实现的原理有⼀丝相似,希望可以给⼀些想⼊⾏AR、VR的朋友⼀些提⽰吧。
要想根据⽤户摇晃⼿机的⾏为轨迹展⽰相应的场景,那必须要使⽤移动端的陀螺仪、加速器等传感器来做相应的协调。现在的移动端已经提供了很多传感器,你可以根据⾃⼰的需要获取相应的数据。
刚开始的时候,我使⽤传感器提供的姿态⾓,也称为欧拉⾓:pitch yaw roll 来显⽰。这种姿态⾓/欧拉⾓⽐较常⽤在航空上,⽆⼈机技术应该也使⽤到了这个技术点。我⽤飞机的模型来展⽰⼀下这三个⾓,就⼀⽬了然了(不同作者使⽤不同的坐标系,使⽤哪种坐标系,个⼈⽽定。):
图⼀
姿态⾓/欧拉⾓在数学上理解起来会有点抽象,我也是稍理解⼀点。在维基百科上,欧拉⾓定义为:⽤来描述刚体在三维欧⼏⾥得空间的取向,对于任何参考系,⼀个刚体的取向,是依照顺序,从这参考系,做三个欧拉⾓的旋转⽽设定的。有兴趣了解得深⼊⼀点,可以参考(需FQ):
我们也可以简单理解这三个⾓代表什么意思:
保姆日记下载1、俯仰⾓θ(pitch):围绕Y轴旋转的。
图⼆
2、偏航⾓ψ(yaw):围绕Z轴旋转的⾓度。
图三
3、滚转⾓Φ(roll):围绕X轴旋转的⾓度。
图四
watch的过去式
⼿机的坐标系:
⼿机定义的坐标系统:X轴是⽔平且指向右边,Y轴是垂直且指向前⽅,Z轴指向屏幕的正⾯正上⽅。
xinkai
当⼿机左右摇摆时(绕 y 轴旋转),得到变化的滚转⾓Φ(roll),范围为 (-90 to 90)maya影视动画培训
当⼿机前后摇摆时(绕 x 轴旋转),得到变化的俯仰⾓θ(pitch),范围为 (-180 to 180)
当⼿机横屏转换成竖屏或竖屏转换成横屏时(绕 z 轴旋转),即得到变化的偏航⾓ψ(yaw)。
当⼿机旋转得到相应的⾓度时,我们把屏幕的图⽚替换成相应⾓度的图⽚,这让你感觉⾝临其境,屏幕⾥的场景会跟着我们视觉和谐变化,这就是VR⼤概实现的原理吧。
turpanAndroid提供了类似这个姿态⾓/欧拉⾓的数据,但两者有些区别,Android 把偏航⾓ψ(yaw)定义为⽅位⾓ Azimuth。具体可查看Android 官⽅⽂档:
接收的传感器类型为:(Android官⽅已经摈弃,换了其它⽅法来获取)
新思维培训学校使⽤这种⽅式去获取的数据有些波动,当拿着⼿机不动的时候,数据有时变化也⽐较⼤,所以后期我改⽤了四元数来处理这个问题。后来听说了⼀个⽅案,通过滤波⽅法,可以把姿态⾓/欧拉⾓⼀些波动⽐较⼤的数据过滤点,得到的数据就⽐较平滑了。(这个⽅式,我还没有去试,⼤家可以去了解了解)
使⽤ “四元数” 也可以实现。四元数理解起来也很抽象:简单的超复数,是复数的不可交换延伸。
我是这么简单理解:我们都知道向量,向量是⽤来形容⼀个⼆维空间的轨迹与⽅向,形象化地表⽰为带箭头的线段。四元数则表⽰为在⼀个四维空间的轨迹与⽅向。
来看⼀个四元数的表现形式:
公式⼀
这是 A 到 B 的四元数表⽰,由四个元素组成的数组。我主要讲⼀些实现⽅法,⾥⾯有⼀些名词的含义,需要⼤家找其它的资料慢慢参透。
我们再来看⼀个公式,x、y、z轴的偏移量分别为:
尚雯婕 战公式⼆
由该公式我们看得出,只要知道⼀个四元数的值,我们就能算出 A 到 B 的x、y、z轴的偏移量。voided
我们从陀螺仪传感器获得的四元数数据,是相对于⼿机平放在桌⾯的 xyz 轴的偏移量,我们需要转换成相对上⼀个位置的偏移量,然后根据偏移量更换相应的图⽚。
现在我们看⼀下,怎么获取相对的偏移量:
在平⾯⼆维向量中,我们知道向量的运算:向量AC = 向量AB + 向量BC
公式三
那么在四元数中,我们假设从传感器获取到
第⼀个四元数为,
假设A点原点,即⼿机平放在桌⾯⽔平位置上。第⼆个四元数为:,
说法英文我们需要得到四元数:
这样才能算出B 到C 的相对 xyz 轴相对位移。通过下⾯公式可以得到:
公式四
现在知道和
clue
由下⾯公式可以得到:
公式五
从A到B的四元数转换成 B到A 的四元数公式,只需把第⼆、第三、第四个元素取负。
知道了和
我们⽤公式四得出,然后通过公式⼆求出 xyz 轴的偏移量。
四元数 x 轴的偏移量与欧拉⾓的俯仰⾓θ(pitch)类似,都是指⼿机竖屏时,左右摇摆的数值。
四元数 y 轴的偏移量与欧拉⾓的滚转⾓Φ(roll)类似,都是指⼿机竖屏时,前后摇摆的数值。
四元数 z 轴的偏移量与欧拉⾓的偏航⾓ψ(yaw)类似,都是指⼿机竖屏时,左右旋转的数值。
在移动端⽐较常⽤到 x、y轴偏移量,就是⼿机左右摇摆与前后摇摆间的偏移。
我做了⼀个Android demo,⽤的就是四元数实现⽅案,通过四元数得到的y轴偏移量,不断替换图⽚。
<-------------------------------
当⼿机横屏,向左倾斜的时候,就会看到右边的视野。也就是判断y轴的相对偏移量,替换不同⾓度的图⽚。(gif 图做得有些卡顿,demo ⾥的例⼦就平滑多了)
-------------------------------->
当⼿机横屏,向右倾斜的时候,就会看到左边的视野。
demo 链接:
四元数国外资料: