LeapMotion拉动物体旋转

在VR中经常需要实现这样的功能:展示一个物体,当玩家碰触到这个物体时,可以用手来拨动这个物体,把物体前后左右上下都看一下,在程序上就是获取手的位置变化来控制物体的旋转,具体的思路呢就是求出手与物体中心两点之间的向量,然后求出上一帧与下一帧这两个向量的夹角,这样就能得出我们的手相对于物体移动的角度,再让物体转动相应的角度即可。物体的转动一定是要以camera 的轴向旋转的。

    public Camera cam;
    private Collider colObj;
    private Vector3 lastPos;
    private bool grab;
    public bool relase;
    private Transform hand;
    void Awake()
    {
        colObj = GetComponent();
    }

    void OnTriggerEnter(Collider col)
    {
        lastPos = col.transform.position;//记录手触碰到物体时的位置
        hand = col.transform;
        grab = true;
        relase = false;
    }

    void OnTriggerExit(Collider e)
    {
        grab = false;
        relase = true;
    }
    void Update()
    {
        if (!grab)
            return;
        //求当前手与物体中心的向量
        Vector3 newVec = Vector3.Normalize((hand.transform.position - transform.position));
        //求上一帧手与物体中心的向量
        Vector3 lastVec = Vector3.Normalize((lastPos - transform.position));
        //计算两个向量之间的夹角
        Quaternion drot = Quaternion.FromToRotation(lastVec, newVec);
        //把quaternion转换成欧拉角
        Vector3 euler = drot.eulerAngles;
        Vector3 camfor = cam.transform.forward;
        Vector3 fwd = Vector3.Cross(camfor, Vector3.up);
        //物体在camera对应的轴向上旋转
        transform.Rotate(cam.transform.up,euler.y,Space.World);
        transform.Rotate(fwd,-euler.x,Space.World);
        //旋转之后再次记录手的位置
        lastPos = hand.transform.position;
    }

好啦,基本的实现就是这些,可以根据实际情况再加一些有趣的功能哦。

你可能感兴趣的:(LeapMotion拉动物体旋转)