【C#】AR unity 陀螺仪控制摄像机 真实方向
2017-08-15 17:17
661 查看
using UnityEngine; using System.Collections; using System.Collections.Generic; using System; public class TurntableSensorCamera : MonoBehaviour { public Transform target; public float distance; public float heightdistance; public bool useRelativeCameraRotation = true; // initial camera and sensor value private Quaternion initialCameraRotation = Quaternion.identity; List<Quaternion> quaternionList = new List<Quaternion>(); private bool gotFirstValue = false; float timer = 0f; // Use this for initialization void Start() { Input.compass.enabled = true; // for distance calculation --> its much easier to make adjusments in the editor, just put // your camera where you want it to be if (target == null) { Debug.LogWarning("Warning! Target for TurntableSensorCamera is null."); return; } // if distance is set to zero, use current camera position --> easier setup if (distance == 0) distance = (transform.position - target.position).magnitude; heightdistance = -1; // if you start the app, you will be viewing in the same direction your unity camera looks right now if (useRelativeCameraRotation) initialCameraRotation = Quaternion.Euler(0, -transform.rotation.eulerAngles.y, 0); else initialCameraRotation = Quaternion.identity; print(-transform.rotation.eulerAngles.y); // direct call // Sensor.Activate(Sensor.Type.RotationVector); // SensorHelper call with fallback // SensorHelper.ActivateRotation(); SensorHelper.TryForceRotationFallback(RotationFallbackType.OrientationAndAcceleration); StartCoroutine(Calibration()); } IEnumerator Calibration() { gotFirstValue = false; while (!SensorHelper.gotFirstValue) { SensorHelper.FetchValue(); yield return null; } SensorHelper.FetchValue(); // wait some frames yield return new WaitForSeconds(0.1f); // Initialize rotation values Quaternion initialSensorRotation = SensorHelper.rotation; initialCameraRotation *= Quaternion.Euler(0, Input.compass.trueHeading - initialSensorRotation.eulerAngles.y, 0);//真实方向 // allow updates gotFirstValue = true; } AngleFilter magneticFilter = new AngleFilter(10); // Update is called once per frame void LateUpdate() { // first value gotten from sensor is the offset value for further processing if (useRelativeCameraRotation) if (!gotFirstValue) return; // do nothing if there is no target timer += Time.deltaTime; if (target == null) return; if (timer >= 1 && timer <= 1.5) { initialCameraRotation = Quaternion.identity; Quaternion initialSensorRotation = SensorHelper.rotation; switch (Input.deviceOrientation) { case DeviceOrientation.FaceDown://该设备与地面平行,屏幕朝下。 initialCameraRotation *= Quaternion.Euler(0, initialSensorRotation.eulerAngles.y - Input.compass.trueHeading, 0);//真实方向 break; case DeviceOrientation.FaceUp://该设备与地面平行,屏幕朝上。 case DeviceOrientation.LandscapeLeft://设备处于横向模式,设备保持直立状态 case DeviceOrientation.LandscapeRight://设备处于横向模式,设备保持直立状态 case DeviceOrientation.Portrait://设备处于竖屏模式,设备保持直立状态 case DeviceOrientation.PortraitUpsideDown://该设备处于竖屏模式,但上下颠倒,设备直立。 initialCameraRotation *= Quaternion.Euler(0, Input.compass.trueHeading - initialSensorRotation.eulerAngles.y, 0);//真实方向 break; } Quaternion q = initialCameraRotation * SensorHelper.rotation; transform.rotation = Quaternion.Slerp(transform.rotation, q, 0.5f); if (timer > 1.5f) timer = 0; } else { quaternionList.Add(initialCameraRotation * SensorHelper.rotation); if (quaternionList.Count > 1) { Quaternion q = new Quaternion(Round(EndPosionManager.Average(quaternionList).x, 1), Round(EndPosionManager.Average(quaternionList).y, 1), Round(EndPosionManager.Average(quaternionList).z, 1), EndPosionManager.Average(quaternionList).w); transform.rotation = Quaternion.Slerp(transform.rotation, q, 0.2f); quaternionList.Clear(); } } transform.position = target.position - transform.forward * distance - transform.up * heightdistance; } float Round(float x, int f)//四元数精度处理 { float result = (float)Math.Round((double)x, f); return result; }插件 GyroDroid下载地址 http://www.manew.com/thread-3596-1-1.html
相关文章推荐
- 【Unity 3D学习】获取鼠标滑动方向(上下左右)-控制摄像机围绕物体旋转
- unity:C#控制人在真实环境中行走
- Unity代码笔记<1>人物动作按键绑定+摄像机控制
- Unity中使用鼠标控制相机的视口方向以及移动
- Unity鼠标出屏幕后 摄像机跟随鼠标方向移动
- Unity教程之-让物体朝摄像机Camera观察方向移动(一)
- Unity 陀螺仪姿态识别、 控制物体旋转移动
- Unity中判断地图上两点之间相对于正北方向的角度 c#实现
- C#设计模式之控制反转即依赖注入-微软提供的Unity
- unity简单自由漫游摄像机控制脚本
- Unity初级——2D切图;C#控制换帧动画
- Unity 2D战棋类 摄像机的局部移动控制
- Unity:如何用C#在Unity中做時間延遲控制
- Unity 控制摄像机旋转、放大、缩小
- 用C#控制摄像机的移动 旋转 缩放
- Unity3D中通过陀螺仪来控制摄像机的旋转
- Unity用鼠标滑轮控制摄像机缩放画面
- unity控制摄像机视图大小的算法
- unity中实现的第三人称摄像机控制脚本。
- unity在shader中获取当前摄像机的方向向量