1. 程式人生 > >【C#】AR unity 陀螺儀控制攝像機 真實方向

【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;
    }
外掛 GyroDroid
下載地址 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

UnityC#《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的原理

UnityC#DateTime時間字串,月份用英文顯示

製作一個鐘錶,要求效果如下圖: 由於每一部分的字型大小不同,我分別使用了不同的Text控制元件。(不懂dalao們有沒有更科學的辦法) 把這些Text控制元件包含在一個Object下,給該Object定義一個指令碼,分別引用這些控制元件。 us

UnityC#《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#報表制作&lt;機房重構&gt;

接下來 機房 工具 學習 test trac fcm 報表 感覺 前言 和VB須要引用其它報表軟件不同,VS自帶報表設計的功能,初次嘗試。就感受到了它的強大之處。 報表制作 話不多說。直接報表的制作過程。 1、首先,我們要先制作一個報表的

C#單例模式&lt;機房重構&gt;

機房 .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)   功能:將一個字符串從一個拷貝到另外一個   程序示