嚴(yán)正聲明:
作者:psklf
出處: http://www.cnblogs.com/psklf/p/6890885.html
歡迎轉(zhuǎn)載,但未經(jīng)作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責(zé)任!

為了實現(xiàn)一個全景圖片展示的功能,需要借助手機的姿態(tài)傳感器,實現(xiàn)一個這樣的功能:當(dāng)手機旋轉(zhuǎn)時,視角也跟著旋轉(zhuǎn)(讀者若理解不能,可以參考下現(xiàn)在流行的 VR 應(yīng)用,使用陀螺儀模式時的效果,亦可稱作“單目 VR 效果”)。這個功能的實現(xiàn)原理為:利用手機傳感器得到手機的當(dāng)前的姿態(tài)的信息(可以是用各種方式來描述的),然后調(diào)整投影的參數(shù),實現(xiàn)最終的圖像跟著手機旋轉(zhuǎn)的效果。

手機姿態(tài)獲取

Android

Android 平臺有各種各樣的傳感器(Sensor),不止一個 sensor 可以實現(xiàn)前文提到的目的。在 Android SDK API Guides 中可以找到所有可用的 sensors。

1 gyroscope

這個就是陀螺儀了,是硬件傳感器(hardware sensor),可以提供設(shè)備繞 xyz 三個軸旋轉(zhuǎn)的角速度。注意這里的坐標(biāo)系就是設(shè)備自身的,短邊 x 軸,長邊 y 軸,z 軸穿越手機屏幕。為實現(xiàn)旋轉(zhuǎn)效果需要的數(shù)據(jù)是旋轉(zhuǎn)的角度(用以計算旋轉(zhuǎn)矩陣),所以如果要用 gyroscope 則許需要對數(shù)據(jù)進行積分,最好加上濾波使效果平穩(wěn)。

2 orientation

這是一個軟件傳感器(software sensor),返回的數(shù)據(jù)不是傳感器硬件直接采集得到的,而是根據(jù)硬件的數(shù)據(jù)進行合適的計算得到的。

閱讀文檔即可得知,此用于獲取設(shè)備在 Yaw,Pitch and Roll 三個方向的旋轉(zhuǎn)的角度,根據(jù)這三個角度也就可以確定其姿態(tài)了。但是官方文檔不推薦這樣使用,而是推薦 rotation vector sensor 并配合 [getRotationMatrix()](https://developer.android.google.cn/reference/android/hardware/SensorManager.html#getRotationMatrix(float[],%20float[],%20float[],%20float[]) 來計算出這三個參數(shù),至于原因,官方文檔只說現(xiàn)在留著這個傳感器類型是歷史原因,讓大家不要用了,沒解釋其他的。具體原因后面解釋。

3 rotation vector

這個 sensor 和上面的 orientation 一樣,都是軟件傳感器。這個表示的仍然是設(shè)備的姿態(tài),但是與上面的不同,這個用一個四元數(shù)來表示設(shè)備的旋轉(zhuǎn),旋轉(zhuǎn)的參考坐標(biāo)系是真實的物理世界。