【C#】AR unity 陀螺儀控制攝像機 真實方向
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; }
下載地址 http://www.manew.com/thread-3596-1-1.html
相關推薦
【C#】AR unity 陀螺儀控制攝像機 真實方向
using UnityEngine; using System.Collections; using System.Collections.Generic; using System; public class TurntableSensorCamera : MonoBe
【unity實用技能】unity3d 陀螺儀控制camera移動旋轉
無https://docs.unity3d.com/ScriptReference/Gyroscope.html unity 官方文檔就很清楚,只有一點要註意: 所有教程都教你怎麽用 input.gyro.attitude 但是這個表示的是空間中的位置,首先你是想做像王者榮耀開頭晃動攝像機的效果,需要把上個位
【C#】WPF音樂控制元件
一、使用SoundPlayer SoundPlayer 只能支援WAV格式的檔案 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.
unity 移動端呼叫陀螺儀控制圖片移動!
using UnityEngine; using System.Collections; using UnityEngine.UI; //陀螺儀控制圖片移動 public class TuoLuoYi : MonoBehaviour { private const float lowPa
【Unity】【C#】《U3d人工智慧程式設計精粹》學習心得--------AI角色的感知方式-視覺感知實現解讀
視覺感知: sightSensor 與 sightTrigger 實現 視覺感知前提: 需要判斷是否有物體的視覺觸發器處於其他物體的視覺感知器的範圍內 感知視覺觸發器的感知器-------sightSensor類 可視角度, 最遠可視距離 繪製可視距離 繪製
【C#】透明控制元件的實現
轉載 http://wtunuiyf.blog.163.com/blog/static/18003200871951529580/ 最近做的一個任務中需要用到透明控制元件,結果在網上找了好久,也沒有一個能真正實現的。當然,講透明form的到是很多,需要呼叫Window
【c#】程式控制post資料 需登陸後保持session的方法
最近在寫一個網頁遊戲的輔助工具。就來說說程式控制多次post資料 保持session的方法 學過網頁程式設計的都知道,session保持會話狀態,使得類似登陸功能可以連續保持。 但用程式傳送post請求的時候,session就會丟失。 究其原因,還是要看session的原理
【Unity】【C#】DateTime時間字串,月份用英文顯示
製作一個鐘錶,要求效果如下圖: 由於每一部分的字型大小不同,我分別使用了不同的Text控制元件。(不懂dalao們有沒有更科學的辦法) 把這些Text控制元件包含在一個Object下,給該Object定義一個指令碼,分別引用這些控制元件。 us
【Unity】【C#】《U3d人工智慧程式設計精粹》學習心得--------操縱行為--路徑跟隨
增加Steering的派生類 ----SteeringForFollowPath類 路徑跟隨行為類 路徑跟隨行為類解讀: 行為準備: ①記錄全部路徑點,統計路徑點數。 ②獲取下一個路徑點,並獲取當前是幾號路徑點。(用來標誌是否為終點) 準備是否到達目標點的條
【C#】窗體控制元件隨窗體大小改變(包括字型大小)
其實Anchor和Dock屬性也可以實現,但好象只對容器效果理想,而且字型大小也沒有變化.最近論壇上有好多這樣的貼子,具體實現程式碼如下: private void setTag(Control cons) { f
Unity實現對移動端的陀螺儀控制
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GyroController : MonoBehaviour {
【C】字符串常量和字符數組
gcc pre class fun 後者 一段 put light cmp 此次博客是轉載某位博主的文章,不過現在找不到了,所以先聲明一下。 先貼一段代碼: #include <stdio.h> int main(int argc, const char**
【C#】監測文件改變類
tco private clas 目錄修改 obj directory 設置 行修改 config using System.IO;//首先實例化一個對象 FileSystemWatcher watcher = new FileSystemWatcher(); //
【C#】報表制作<機房重構>
接下來 機房 工具 學習 test trac fcm 報表 感覺 前言 和VB須要引用其它報表軟件不同,VS自帶報表設計的功能,初次嘗試。就感受到了它的強大之處。 報表制作 話不多說。直接報表的制作過程。 1、首先,我們要先制作一個報表的
【C#】單例模式<機房重構>
機房 .sh 不能 是否 gist 應用 調用方法 單例模式 sender 前言 在機房重構之前。我們學習了設計模式。在這次重構中,我們的任務就是將這些模式,加入到機房的重構中去。如今先來解決一個最簡單的問題——窗口的超生。 假設不加以限
【C#】Color顏色對照表
pac eee lower fda flow dig val rim cee Color.AliceBlue 240,248,255 Color.LightSalmon 255,160,122 Color.
【轉】【C#】全局鍵盤監聽
控制 keyevent 註冊 相關 一個 rsh rds api函數 start using System; using System.Collections.Generic; using System.Text; using System.Runtime.Inter
Debug目錄、Release目錄,bin目錄、obj目錄,vshost.exe.config文件、.exe.config文件分析【C#】
修改 .com 重啟 不同 span http ocs 資料 更改 Debug目錄、Release目錄,bin目錄、obj目錄,vshost.exe.config文件、.exe.config文件分析【C#】 2013-10-06 孤風卓影 摘自 csdn博客 閱 5
【c++】LUOGU P1808 單詞分類
使用 排序 nbsp pan size pre 最短 include namespace STL大法好!!! 使用sort()將string排序,map去重並統計即可。 最短代碼如下: 1 #include<bits/stdc++.h> 2 using n
【C】常用的字符串函數
uri 實例 返回 blog logs tin bsp main include 1. strcpy 函數名:strcpy 用法:char *strcpy(char *destin, char *cource) 功能:將一個字符串從一個拷貝到另外一個 程序示