1.一种在虚拟现实环境中实现拧螺丝的方法,其特征在于,包括以下步骤:
在虚幻引擎中添加一个螺丝刀类ScrewDiver和一个螺丝类Screw;
所述螺丝刀类ScrewDiver包括第一组件Arrow和第二组件ArrowNoMove;所述组件ArrowNoMove固定在螺丝刀上;所述第一组件Arrow初始位置和初始方向均与第二组件ArrowNoMove的位置和方向一致;所述组件ArrowNoMove不会附着到玩家手上,一直固定在螺丝刀上,用于与附着之后的Arrow对比计算旋转;
当检测到螺丝刀和螺丝发生碰撞时,进行拧螺丝步骤:将第一组件Arrow附着到玩家的手上,经过一帧时间后,获取第一组件Arrow的方向向量,计算第一组件Arrow和第二组件ArrowNoMove当前的方向向量在垂直于螺丝刀方向轴的平面上的投影的夹角LocalRot;判断玩家的手的旋转方向为顺时针还是逆时针,根据判断的结果使螺丝旋转一个角度LocalRot;
判断当前螺丝是否拧完,若否,继续进行下一帧的拧螺丝步骤,若是,结束。
2.根据权利要求1所述的在虚拟现实环境中实现拧螺丝的方法,其特征在于,在计算得到第一组件Arrow和第二组件ArrowNoMove当前的方向向量在垂直于螺丝刀方向轴的平面上的投影的夹角LocalRot后,把第一组件Arrow重置到螺丝刀上。
3.根据权利要求1所述的在虚拟现实环境中实现拧螺丝的方法,其特征在于,当检测到螺丝刀和螺丝发生碰撞时,调用虚幻引擎自带的碰撞框碰撞调用函数BeginOverlap,使螺丝刀接收到BeginOverlap事件,接着调用箭头附着函数SetLastVecPoint,将第一组件Arrow附着到玩家手上。
4.根据权利要求1所述的在虚拟现实环境中实现拧螺丝的方法,其特征在于,所述判断玩家的手的旋转方向,具体为:令第一组件Arrow当前在垂直于螺丝刀方向轴的平面的上的投影向量为向量ArrowProjection,第二组件ArrowNoMove当前的向量为向量ArrowNoMove;
将向量ArrowNoMove和向量ArrowProjection进行叉乘得出的向量与螺丝刀方向进行比较,如果方向一致则玩家的手在这一帧的旋转方向是顺时针,如果方向相反则玩家的手在这一帧方向的旋转方向为逆时针。
5.根据权利要求4所述的在虚拟现实环境中实现拧螺丝的方法,其特征在于,当玩家的手的旋转方向为逆时针时,将角度LocalRot的值乘上‑1后,对角度LocalRot重新赋值。
6.根据权利要求1或5所述的在虚拟现实环境中实现拧螺丝的方法,其特征在于,还包括以下步骤:设置螺丝刀的转动有效范围值,当角度LocalRot超出转动有效范围值的范围时,将LocalRot的值设置为0。
7.根据权利要求1所述的在虚拟现实环境中实现拧螺丝的方法,其特征在于,还包括以下步骤:在判断玩家的手的旋转方向步骤之后,判断玩家的手的旋转方向是否与螺丝实际需要的旋转方向一致,若否,结束执行该帧的任务。
8.根据权利要求1所述的在虚拟现实环境中实现拧螺丝的方法,其特征在于,所述根据判断的结果使旋转一个角度LocalRot,具体为:调用虚幻引擎自带的增量旋转的函数AddLocalRotation使螺丝旋转一个角度LocalRot。
9.根据权利要求1所述的在虚拟现实环境中实现拧螺丝的方法,其特征在于,所述判断当前螺丝是否拧完,具体为:令从头到尾完成螺丝的松紧需要旋转的角度为SuccessAngle,令螺丝的当前进度为CurrentProgress,螺丝每次转动后更新CurrentProgress的值,判断CurrentProgress的值是否大于SuccessAngle的值,若是,则表示螺丝已拧完。