在VR中经常需要实现这样的功能:展示一个物体,当玩家碰触到这个物体时,可以用手来拨动这个物体,把物体前后左右上下都看一下,在程序上就是获取手的位置变化来控制物体的旋转,具体的思路呢就是求出手与物体中心两点之间的向量,然后求出上一帧与下一帧这两个向量的夹角,这样就能得出我们的手相对于物体移动的角度,再让物体转动相应的角度即可。物体的转动一定是要以camera 的轴向旋转的。
public Camera cam;
private Collider colObj;
private Vector3 lastPos;
private bool grab;
public bool relase;
private Transform hand;
void Awake()
{
colObj = GetComponent<Collider>();
}
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;
}
好啦,基本的实现就是这些,可以根据实际情况再加一些有趣的功能哦。