1. 程式人生 > >Unity3D開發之HTCVIVE初始化頭盔Transform資訊

Unity3D開發之HTCVIVE初始化頭盔Transform資訊

我們在開發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即可。希望本部落格對你有幫助。