Android-四元数-控制VR设备的旋转
2016-01-12 11:46
477 查看
首先参考维基百科了解四元数的基本概念:
https://zh.wikipedia.org/wiki/%E5%9B%9B%E5%85%83%E6%95%B0%E4%B8%8E%E7%A9%BA%E9%97%B4%E6%97%8B%E8%BD%AC
参考
http://www.2cto.com/kf/201210/162858.html
/article/1359522.html
http://www.4byte.cn/question/502095/get-quaternion-from-android-gyroscope.html
Android中对传感器类型的定义:
native层Sensor.h中没有定义旋转矢量的枚举变量,仅有:
再模拟SensorManager.java中的getQuaternionFromVector函数转换成四元数即可(不是很严格,为简单,去掉了rv长度为4的情形)
转换出来的长度为4的数组Q即为所需四元数。
ps:记得,横竖屏切换的时候传-z,而非z(rotation[2] = -event.vector.z;)
https://zh.wikipedia.org/wiki/%E5%9B%9B%E5%85%83%E6%95%B0%E4%B8%8E%E7%A9%BA%E9%97%B4%E6%97%8B%E8%BD%AC
参考
http://www.2cto.com/kf/201210/162858.html
/article/1359522.html
http://www.4byte.cn/question/502095/get-quaternion-from-android-gyroscope.html
Android中对传感器类型的定义:
#define SENSOR_TYPE_ACCELEROMETER 1 //加速度 #define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力 #define SENSOR_TYPE_ORIENTATION 3 //方向 #define SENSOR_TYPE_GYROSCOPE 4 //陀螺仪 #define SENSOR_TYPE_LIGHT 5 //光线感应 #define SENSOR_TYPE_PRESSURE 6 //压力 #define SENSOR_TYPE_TEMPERATURE 7 //温度 #define SENSOR_TYPE_PROXIMITY 8 //接近 #define SENSOR_TYPE_GRAVITY 9 //重力 #define SENSOR_TYPE_LINEAR_ACCELERATION 10//线性加速度 #define SENSOR_TYPE_ROTATION_VECTOR 11//旋转矢量
native层Sensor.h中没有定义旋转矢量的枚举变量,仅有:
/* * Sensor types * (keep in sync with hardware/sensor.h) */ enum { ASENSOR_TYPE_ACCELEROMETER = 1, ASENSOR_TYPE_MAGNETIC_FIELD = 2, ASENSOR_TYPE_GYROSCOPE = 4, ASENSOR_TYPE_LIGHT = 5, ASENSOR_TYPE_PROXIMITY = 8 };因此这里用整型11做参数获取旋转矢量:
appState.engine.sensorManager = ASensorManager_getInstance(); appState.engine.accelerometerSensor = ASensorManager_getDefaultSensor( appState.engine.sensorManager, 11); appState.engine.sensorEventQueue = ASensorManager_createEventQueue( appState.engine.sensorManager, app->looper, LOOPER_ID_USER, NULL, NULL);
再模拟SensorManager.java中的getQuaternionFromVector函数转换成四元数即可(不是很严格,为简单,去掉了rv长度为4的情形)
void getQuaternionFromVector(float Q[], float rv[]) { ALOGV("rv(%f,%f,%f)",rv[0],rv[1],rv[2]); Q[0] = 1 - rv[0] * rv[0] - rv[1] * rv[1] - rv[2] * rv[2]; Q[0] = (Q[0] > 0) ? (float) sqrt(Q[0]) : 0; Q[1] = rv[0]; Q[2] = rv[1]; Q[3] = rv[2]; ALOGV("Q(%f,%f,%f,%f)",Q[0],Q[1],Q[2],Q[3]); }
转换出来的长度为4的数组Q即为所需四元数。
ps:记得,横竖屏切换的时候传-z,而非z(rotation[2] = -event.vector.z;)
相关文章推荐
- 创建手机桌面的悬浮图标
- Android sdk等工具下载地址
- Android SD卡路径问题以及如何获取SDCard 内存
- 同步、更新、下载Android Source & SDK from 国内镜像站
- android应用程序窗口框架学习(1)-view绘制流程源代码解析
- Android常见XML属性解析
- Android编程实现监控apk安装,卸载,替换的方法
- Android studio快捷键
- Android 调用系统摄像头拍照保存并且更新到图库
- Android WebView 加载本地SD卡的html
- 关于Android销毁进程的方法。
- Android多种进度条使用详解
- 编译时android编码报错非法字符
- Android操作系统之内存回收策略
- Android开发中BUG、错误汇总(不断更新)
- Android Provision 的详解
- Android 自定义Dialog对话框详解
- android方便的自定义Dialog工厂类
- MVP模式在android的使用
- android中的AIDL进程间通信