簡體   English   中英

如何計算手機在平放時圍繞y軸(滾動)的旋轉?

[英]How to calculate the phones rotation around the y axis (roll) while it's laying flat?

這幾行C#代碼使用加速度計計算手機圍繞y軸的旋轉:

private float GetRoll() {
    /*
     * Sum up the accelerometer events
     */
    Vector3 accelerationVector = Vector3.zero;
    for (int i=0; i < Input.accelerationEventCount; i++) {
        AccelerationEvent accEvent = Input.GetAccelerationEvent(i);
        accelerationVector += accEvent.acceleration * accEvent.deltaTime;
    }
    accelerationVector.Normalize();

    int inclination = (int) Mathf.Round(Mathf.Rad2Deg * Mathf.Acos(accelerationVector.z));
    float roll = 0;
    if (inclination < 25 || inclination > 155) {
        /*
         * How to calculate the rotation here?
         */
    } else {
        roll = Mathf.Round(Mathf.Rad2Deg * Mathf.Atan2(accelerationVector.x, accelerationVector.y));
    }
    return roll;
}

如果手機平放在桌子上,你知道數學運算嗎? 即如果inclination小於25度或大於155度? 該代碼源自此SO帖子 ,其中提到可以使用指南針。 不幸的是我不知道如何,所以你的建議非常感謝。 另外,如果可能的話,我想避免使用陀螺儀,而是堅持使用加速度計。

任何建議都是受歡迎的。 謝謝。

你為什么不用陀螺儀?

如果你認為它,如果旋轉軸與加速度之和完全平行,那么從加速度矢量獲得任何類型的旋轉信息似乎在物理上是不可能的。

(也許你可以從向心力中獲得它的速度,但沒有別的。)

你的要求實際上是不可能的

歸結為陀螺儀測量空間中的絕對方向,而加速度計測量速度的變化(加速度)。 當你使用微積分從加速度(m / s ^ 2)到位置(m)時,你會得到距離偏移 - 這也是直觀的。 因為加速度計是在速度變化時觸發的,所以在飛機上它甚至不會觸發400mph的恆定速度。

您不僅需要整個加速度計歷史記錄,還需要原始位置和方向更不用說在此類錯誤中推斷出的所有誤差,1%傳感器誤差在此計算中變得更大。

要獲得某種類型的傳感器數據,必須使用陀螺儀(或羅盤)。 事實上,要直接回答您的問題,不需要加速度計,因為這是一個尋找位置的問題。 但是,如果您想對用戶手勢做出反應,您的實際需求可能會受益於加速計。

Input.gyro.attitude應該給你絕對的方向值。 獲得這些值,以便它在沒有滾動的情況下平放,然后在一定量的滾動下再次獲得這些值。 在此之后,您應該獲得一些數據符合您的標准的數據以及該條件下的一些誤差范圍。

https://docs.unity3d.com/ScriptReference/Gyroscope.html

您可以使用

 onSensorChanged(SensorEvent event)

在這種情況下,您可以檢測傳感器的類型並計算Roll,Azimut和Pitch,如給出的示例所示

  float azimuthVal = event.values[0];
  float pitchVal = event.values[1];
  float rollVal = event.values[2];

您必須閱讀哪些傳感器值

event.sensor.getType()

並且方向是為了找到您可以從方法獲得的傾斜

SensorManager.getOrientation

並且可以獲得角度

azimutOrt = orientation[0];
pitchOrt = orientation[1];
rollOrt = orientation[2];

對於Unity,可以使用以下三種

Input.acceleration: Accelerometer
Input.gyro.rotationRate:
Input.gyro.attitude
Input.gyro.gravity:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM