转至=blogxgwz7
Unity自带陀螺仪功能,今天就利用陀螺仪实现一个VR相机功能。步骤如下:
代码如下:
using UnityEngine;
using System.Collections;public class GyroController : MonoBehaviour
{// Fieldsprivate readonly Quaternion baseIdentity = Quaternion.Euler(90f, 0f, 0f);private Quaternion baseOrientation = Quaternion.Euler(90f, 0f, 0f);private Quaternion baseOrientationRotationFix = Quaternion.identity;private Quaternion calibration = Quaternion.identity;private Quaternion cameraBase = Quaternion.identity;private bool debug = true;public static bool gyroAvaiable;private bool gyroEnabled = true;private Quaternion gyroInitialRotation;public static bool gyroOff;private Quaternion initialRotation;private readonly Quaternion landscapeLeft = Quaternion.Euler(0f, 0f, -90f);private readonly Quaternion landscapeRight = Quaternion.Euler(0f, 0f, 90f);private const float lowPassFilterFactor = 0.1f;private Quaternion offsetRotation;private Quaternion referanceRotation = Quaternion.identity;private readonly Quaternion upsideDown = Quaternion.Euler(0f, 0f, 180f);// Methodsprivate void AttachGyro(){Enabled = true;this.ResetBaseOrientation();this.UpdateCalibration(true);this.UpdateCameraBaseRotation(true);this.RecalculateReferenceRotation();}private void Awake(){gyroAvaiable = SystemInfo.supportsGyroscope;}private static Quaternion ConvertRotation(Quaternion q){return new Quaternion(q.x, q.y, -q.z, -q.w);}private void DetachGyro(){Enabled = false;}private Quaternion GetRotFix(){return Quaternion.identity;}private void RecalculateReferenceRotation(){feranceRotation = Quaternion.Inverse(this.baseOrientation) * Quaternion.Inverse(this.calibration);}private void ResetBaseOrientation(){this.baseOrientationRotationFix = this.GetRotFix();this.baseOrientation = this.baseOrientationRotationFix * this.baseIdentity;}protected void Start(){abled = abled = true;this.AttachGyro();this.initialRotation = ansform.InitialRotation = attitude;}private void Update(){gyroOff = PlayerPrefs.GetInt("gyro-off") == 1;if (Enabled ){ansform.localRotation = Quaternion.ansform.localRotation, this.cameraBase * (feranceRotation * attitude) * this.GetRotFix()), 0.5f);//0.1f}}private void UpdateCalibration(bool onlyHorizontal){if (onlyHorizontal){Vector3 toDirection = (Vector3) (attitude * -Vector3.forward);toDirection.z = 0f;if (toDirection == ){this.calibration = Quaternion.identity;}else{this.calibration = Quaternion.FromToRotation((Vector3) (this.baseOrientationRotationFix * Vector3.up), toDirection);}}else{this.calibration = attitude;}}private void UpdateCameraBaseRotation(bool onlyHorizontal){if (onlyHorizontal){Vector3 forward = ansform.forward;forward.y = 0f;if (forward == ){this.cameraBase = Quaternion.identity;}else{this.cameraBase = Quaternion.FromToRotation(Vector3.forward, forward);}}else{this.cameraBase = ation;}}
}
本文发布于:2024-01-28 12:14:41,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064152857347.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |