java - 前倾还是后倾?TYPE_ROTATION_VECTOR
问题描述
我试图从 Sensor.TYPE_ROTATION_VECTOR 获得音高,但我不知道如何解释结果。
无论手机向前还是向后倾斜,俯仰值似乎都是相同的(向前 = 手机顶部远离用户面部,手机底部靠近用户面部)。
图像中的线条代表从侧面观察并倾斜到不同角度的手机。顶部/中间手机垂直于地面。
我需要一个类似于方位角的值(从 -180 到 +180 并且不重复)。
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
SensorManager.getRotationMatrixFromVector(rMat, sensorEvent.values);
SensorManager.getOrientation(rMat, orientation);
pitch = (int) (Math.toDegrees(orientation[1]) ) ;
解决方案
我最终添加了另一个 TYPE_ACCELEROMETER 传感器侦听器。我检查 values[2] 是否为正,并根据结果将音高计算为 0 到 360 之间的数字(从 12 点开始顺时针方向)。它工作正常,但它跳过了 355-5 和 175-185 之间的一些数字。如果您有更好的解决方案,请告诉我。
来自 Android 文档:
values[2] : 绕 Z 轴的角速度(无漂移补偿),单位 rad/s
boolean isPositive = true;
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
isPositive = sensorEvent.values[2] > 0;
}
if (sensorEvent.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
SensorManager.getRotationMatrixFromVector(rMat, sensorEvent.values);
SensorManager.getOrientation(rMat, orientation);
pitch = (int) (Math.toDegrees(orientation[1]) ) ;
if(isPositive) //between 6 and 12 o'clock
pitch = 270 - pitch;
else //between 12 and 6 o'clock
pitch = 90 + pitch;
//...
推荐阅读
- android - 修复 java.net.ProtocolException: Expected ':status' header not present from NGINX 的问题
- node.js - 如何为 Visual Studio 2019 安装 node js 工具?
- c++ - 保存对 tbb::concurrent_unordered_map 项目的引用是否安全?
- node.js - nodejs pem 为内网 CIPHER_MISMATCH 生成 openssl 自签名证书
- python - 如何将 DataFrame 转换为嵌套的 JSON
- rest - 制作良好的 REST API 请求缓存密钥的最佳实践是什么?
- java - 如何从单独的方法打印 ArrayList?
- angular - 使用 ngFor 从数组中查找最后一个索引
- android - 在 Glide 中找不到签名()
- identityserver4 - 授权流访问和刷新令牌