HTC VIVE TouchPad简单方向控制

来源:互联网 发布:电信网络架构 编辑:程序博客网 时间:2024/05/23 10:59

由于现在还没有设备,没法亲身体会,只能先想象一下了。

好进入正题 首先引入叉积 的数学概念

  叉积 
  叉积的定义: c =a x b  其中a,b,c均为向量。即两个向量的叉积得到的还是向量! 
  性质1: c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面 。 
  性质2: 模长|c|=|a||b|sin<a,b> 
  性质3: 满足右手法则 。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。 

  根据上面的性质2,我们也同样的可以计算出两个向量的夹角。

用到了性质三进行计算方向。引入控制器控制代码。

using System.Collections;using System.Collections.Generic;using UnityEngine;using Valve.VR;public class NewBehaviourScript : MonoBehaviour {    void check_key_toMove() {        //获取右手控制器设备        SteamVR_Controller.Device _device = SteamVR_Controller.Input((int)track.index);        //检测是否按压控制器的touchpad        bool isPressTouchPad= _device.GetPress(SteamVR_Controller.ButtonMask.Touchpad);        float angle = 0f;        //如果按了        if (isPressTouchPad) {           //获取按压点的坐标            Vector2 touchaxis= _device.GetAxis();            //产生a为参考系            Vector2 a = new Vector2(0f, 1f);            //进行角度计算(没有正负值不能区分方向)            angle = Vector2.Angle(a, touchaxis);            //叉积运算计算触摸点向量相对a是顺时针(cross.z为负)还是逆时针(cross.z为正)            Vector3 cross = Vector3.Cross(a, touchaxis);            angle = cross.z > 0 ? -angle : angle;            if (angle <= 45 && angle > -45) {                transform.forward = Vector3.forward;            }            else if (angle <= -45 && angle > -135) {                transform.forward = Vector3.left;            }            else if (angle <= -135 || angle > 135)            {                transform.forward = Vector3.back;            }            else if (angle <= 135 && angle > 45)            {                transform.forward = Vector3.right;            }        }          }}






1 0