Unity3D开发之HTCVIVE初始化头盔Transform信息

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33994566/article/details/83054338

我们在开发VR项目时,会遇到这个问题。就是在不确定玩家初始位置以及初始角度方向的时候,我们希望用户在进入场景的第一时间面对的是我们设定好的方向及位置。这个时候就需要我们使用脚本来提前控制设定。

下面是HTCvive为例:Vive提供的预制体如下:

CameraRig是最外层的物体,Camera(Head)就是我们的头部。我们只需通过设置CameraRig的位置以及转角就可以使我们的Head达到我们设定的Transform信息。

初始化CameraRig脚本代码如下:

 public Transform eyeTransform;
 
    // Use this for initialization  Target是我们在场景中我们创建的一个空物体  forward指向我们设定的方向  position是设定用户处在的位置
    public void Init (Transform Target)
    {
        //旋转部分
        Vector3 eyeForward = eyeTransform.forward;
        eyeForward = new Vector3(eyeForward.x,0, eyeForward.z);//首先我们需要获取初始化时用户所朝方向
        float d =Vector3.Dot(Vector3.up, Vector3.Cross(eyeForward, Target.forward));//d的值用来判断是顺时针还是逆时针
        float angle = Vector3.Angle(Target.forward, eyeForward);//用户forward和设定物体的forward的角度(值是小于180的)
        if (d < 0) angle = 360 - angle;//如果d小于0 就是逆时针旋转angle度  顺时针旋转360-angle
        Quaternion q = new Quaternion(0,Mathf.Sin(Mathf.Deg2Rad*angle/2),0,Mathf.Cos(Mathf.Deg2Rad * angle / 2));
        transform.rotation = transform.rotation * q;  //我们写一个旋转让CameraRig顺时针旋转angle度


        Vector3 offset = transform.position - eyeTransform.position;
        //offset = new Vector3(offset.x, 0, offset.z);
        transform.position = Target.position+offset+new Vector3(0, -offset.y,0);
    }

把上面脚本挂在CameraRig上,面板绑定eyeTransform。我们调用只需传入在场景提前设定好的Transform即可。希望本博客对你有帮助。

猜你喜欢

转载自blog.csdn.net/qq_33994566/article/details/83054338