HTC VIVE TouchPad简单方向控制

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

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

  叉积 
  叉积的定义: 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值