基于陀螺仪的全景视频播放器基础上,增加手指拖动旋转的效果

笔记一下:

背景:手机全景播放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就可以了。





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值