我已經嘗試回答你的問題,盡我所能,爲你的問題問得有點我不清楚。
首先,由於您使用的是力和物理,您應該使用void FixedUpdate()
函數而不是void Update()
函數。這將確保您的代碼以統一的時間間隔執行,這在處理物理時非常重要。
我也不確定你爲什麼實例化一個新的GameObject。您可以簡單地將此腳本添加到Unity中的Camera GameObject中,然後將Rigidbody組件添加到相機中。這將簡化您的Start()
功能,它應該只包含以下兩行:
Input.gyro.enabled = true;
RB = gameObject.GetComponent<Rigidbody>();
其次,要注意的是四元數從Input.gyro.attide
返回了左手座標,而團結具有右手座標是很重要的。從陀螺儀到Unity這種轉換可以用下面的函數來完成:
Quaternion GyroToUnity(Quaternion quat)
{
return new Quaternion(quat.x, quat.z, quat.y, -quat.w);
}
我敢肯定還有其他的方法來完成這種轉換,但這種方式對我的作品。
現在讓我們來處理相機的旋轉。通過設置相機的transform.rotation
等於您剛從陀螺儀轉換的四元數來設置相機的旋轉開始。然而,還有一個問題,因爲陀螺儀的z軸指向與Unity的y軸相同的方向。這可以通過簡單地執行transform.Rotate(90,0,0);
來解決。最後,我們使用以下這行代碼設置相機的旋轉:
transform.rotation = Quaternion.Euler(new Vector3(0f, transform.rotation.eulerAngles.y, 0f));
最後,我們必須處理向相機添加力。我不確定你想如何處理運動,但我認爲你想要相對於相機的旋轉z軸的運動。爲此,您需要使用相機上Rigidbody組件的AddRelativeForce(Vector3 relativeForce)
。
但是,要確定力的方向,我們必須從早先轉換爲Unity的Quaternion獲得關於x軸的旋轉度。 yourQuat.eulerAngles.x
,它返回一個float
,使得0 < = x < 360.通過我們定位相機座標系的方式,直接使用iOS設備應該返回大約0.0的值。當我在這個問題上發揮的時候,我發現這段代碼充分執導的相機:
Vector3 relativeForce;
if (yourQuat.eulerAngles.x > 315 || yourQuat.eulerAngles.x < 90)
relativeForce = Vector3.forward;
else if (yourQuat.eulerAngles.x < 315)
relativeForce = Vector3.back;
else
relativeForce = Vector3.zero;
最後採取後續Vector3
值,並使用像這樣
RB.AddRelativeForce(relativeForce);
希望有所幫助。如果這不是您正在尋找的確切功能,這應該讓您開始微調您的程序以完成您想要的功能。
我不確定我是否理解你正在嘗試做什麼,但是爲相機父項添加一個剛體並且向其添加力而不是直接向相機添加力是否更有意義?否則,當相機從其原始位置移開時,旋轉相機父母的效果將會改變。 – lockstock