基于陀螺仪的全景视频播放器基础上,增加手指拖动旋转的效果
2017-04-14 11:09
537 查看
笔记一下:
背景:手机全景播放app,放向根据陀螺仪调整。
需求:增加一个功能,手指滑动屏幕,可以调整坐标系方向。或者关闭陀螺仪仅仅用手指操作方向。
方法:
1. 根据触摸的api得到精度和纬度方向旋转角度,thOffset,laOffset。(实现略)
2. 根据thOffset,laOffset计算旋转后在球面上的矢量,(lookX, lookY, lookZ)。因为在球坐标上根据经纬度很好计算
// x = sin(theta)cos(lamda)
// y = cos(theta)
// z = sin(theta)sin (lamda)
public int modifyViewVectorSphere (float thOffset, float laOffset)
{
float rotateAngle;
float angleTh, angleLa;
int ret = 0;
if (theta + thOffset >= 180) {
theta = (float) 179;
ret = 1;
//Log.v(TAG, "chao,?? " + theta);
}
else if (theta + thOffset <= 0) {
theta = 1;
ret = 1;
//Log.v(TAG, "chao,!! " + theta);
}
else {
theta += thOffset;
}
if (lamda + laOffset > 360) {
lamda = lamda + laOffset - 360;
}
else if (lamda + laOffset < 0) {
lamda = lamda + laOffset + 360;
}
else {
lamda = lamda + laOffset;
}
angleTh = (float) (( theta / 180) * PI_T);
angleLa = (float) (( lamda / 180) * PI_T);
lookX = (float) ((float)Math.sin(angleTh) * Math.cos(angleLa));
lookY = (float) ((float)Math.cos(angleTh) );
lookZ = (float) ((float)Math.sin(angleTh) * Math.sin(angleLa));
return ret;
}
modifyViewVectorSphere(thAngle, laAngle);
3. 通过Matrix.setLookAtM的方法,以旋转后的矢量得到旋转矩阵。
Matrix.setLookAtM(mVMatrix, 0,
0f, 0f, 0f,
lookX, lookY, lookZ,
0f, 1f, 0.0f);
4. 处理MVP矩阵中的V(实际乘的顺序是PVM),对于旋转,先做(lookX, lookY, lookZ)的旋转,再做陀螺仪得到矩阵fm的旋转,所以View矩阵为
Matrix.multiplyMM(mVMatrix, 0, fm, 0, mVMatrix, 0);
MatrixState.setViewMatrix(mVMatrix);
5. 后面按PVM乘起来,draw就可以了。
背景:手机全景播放app,放向根据陀螺仪调整。
需求:增加一个功能,手指滑动屏幕,可以调整坐标系方向。或者关闭陀螺仪仅仅用手指操作方向。
方法:
1. 根据触摸的api得到精度和纬度方向旋转角度,thOffset,laOffset。(实现略)
2. 根据thOffset,laOffset计算旋转后在球面上的矢量,(lookX, lookY, lookZ)。因为在球坐标上根据经纬度很好计算
// x = sin(theta)cos(lamda)
// y = cos(theta)
// z = sin(theta)sin (lamda)
public int modifyViewVectorSphere (float thOffset, float laOffset)
{
float rotateAngle;
float angleTh, angleLa;
int ret = 0;
if (theta + thOffset >= 180) {
theta = (float) 179;
ret = 1;
//Log.v(TAG, "chao,?? " + theta);
}
else if (theta + thOffset <= 0) {
theta = 1;
ret = 1;
//Log.v(TAG, "chao,!! " + theta);
}
else {
theta += thOffset;
}
if (lamda + laOffset > 360) {
lamda = lamda + laOffset - 360;
}
else if (lamda + laOffset < 0) {
lamda = lamda + laOffset + 360;
}
else {
lamda = lamda + laOffset;
}
angleTh = (float) (( theta / 180) * PI_T);
angleLa = (float) (( lamda / 180) * PI_T);
lookX = (float) ((float)Math.sin(angleTh) * Math.cos(angleLa));
lookY = (float) ((float)Math.cos(angleTh) );
lookZ = (float) ((float)Math.sin(angleTh) * Math.sin(angleLa));
return ret;
}
modifyViewVectorSphere(thAngle, laAngle);
3. 通过Matrix.setLookAtM的方法,以旋转后的矢量得到旋转矩阵。
Matrix.setLookAtM(mVMatrix, 0,
0f, 0f, 0f,
lookX, lookY, lookZ,
0f, 1f, 0.0f);
4. 处理MVP矩阵中的V(实际乘的顺序是PVM),对于旋转,先做(lookX, lookY, lookZ)的旋转,再做陀螺仪得到矩阵fm的旋转,所以View矩阵为
Matrix.multiplyMM(mVMatrix, 0, fm, 0, mVMatrix, 0);
MatrixState.setViewMatrix(mVMatrix);
5. 后面按PVM乘起来,draw就可以了。
相关文章推荐
- 基于yui3的qzone空间拖动效果
- android基础->拖动效果(Gallery)
- Android基础-简单的动画实现 *补间动画 *透明度渐变 *旋转动画 *位移动画 *如果需要几个效果整合到一起,需要将所有效果全部放到set里
- Swift基础--手势识别(双击、捏、旋转、拖动、划动、长按)
- Swift基础--手势识别(双击、捏、旋转、拖动、划动、长按)
- C#基础系列:开发自己的窗体设计器(在容器上拖动鼠标增加控件)
- Swift基础--手势识别(双击、捏、旋转、拖动、划动、长按)
- WPF技术触屏上的应用系列(三): 视频播放器的使用及视频播放、播放、暂停、可拖动播放进度效果实现
- 基于jQuery页面窗口拖动预览效果
- iOS 基于CATransition实现翻页、旋转等动画效果 —— HERO博客
- 在拖动示例基础上增加视图切换
- unity3d 拖动模型对象旋转效果
- 使用 ThreeSixty 创建可拖动的 360 度全景图片预览效果
- WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果
- WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果
- 基于jquery的一行代码轻松实现拖动效果
- C#基础系列:开发自己的窗体设计器(在容器上拖动鼠标增加控件)
- 基于CSS3的3D旋转效果
- unity中手指选中物体拖动旋转
- 基于JS代码实现图片在页面中旋转效果