leapmotion 正反问题_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;

}

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值