由于现在还没有设备,没法亲身体会,只能先想象一下了。
好进入正题 首先引入叉积 的数学概念
叉积
叉积的定义: 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;
}
}
}
}