第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從加速度數(shù)據(jù)創(chuàng)建四元數(shù)

從加速度數(shù)據(jù)創(chuàng)建四元數(shù)

C#
明月笑刀無情 2021-11-14 14:49:23
所以我有一個加速度傳感器,可以提供加速度數(shù)據(jù)。設(shè)備當(dāng)前停在某個位置,因此數(shù)據(jù)如下所示(每個軸都有一些噪音):ACCELX = 264ACCELY = -43ACCELZ = 964然后是一個代表設(shè)備的 3D 模型,“我想要的”就是這個 3D 模型來表示真實設(shè)備的方向。在我試圖了解.NET中四元數(shù)的用法時,這是我狼吞虎咽的代碼:/* globals */Vector3D PrevVector = new Vector3D(0, 0, 0);ModelVisual3D model; // initialized and model file loadedprivate async void TimerEvent() {    RotateTransform3D rot = new RotateTransform3D();    QuaternionRotation3D q = new QuaternionRotation3D();    double x = 0, y = 0, z = 0;    List<Reading> results = await Device.ReadSensor();    foreach (Reading r in results)    {        switch (r.Type)        {            case "RPF_SEN_ACCELX":                x = r.Value;                break;            case "RPF_SEN_ACCELY":                y = r.Value;                break;            case "RPF_SEN_ACCELZ":                z = r.Value;                break;        }    }    double angle = Vector3D.AngleBetween(new Vector3D(x, y, z), PrevVector);    q.Quaternion = new Quaternion(new Vector3D(x, y, z), angle);    rot.Rotation = q;    model.Transform = rot;    PrevVector = new Vector3D(x, y, z); }移動我的真實設(shè)備確實會導(dǎo)致報告值發(fā)生變化,但屏幕上的模型只是在我看來隨機的方向上抽搐,與噪音相差無幾,似乎與我如何旋轉(zhuǎn)真實設(shè)備無關(guān)。我很確定我正在錯誤地構(gòu)建和使用四元數(shù)。我該怎么做才對?這是帶有 WPF 的 .NET。還有HelixToolkit.WPF可用,但我還沒有看到任何從那里的加速度數(shù)據(jù)創(chuàng)建四元數(shù)的函數(shù)。更高級別的框架(例如 Unreal Engine 或 Unity)不適用于此項目。
查看完整描述

2 回答

?
DIEA

TA貢獻1820條經(jīng)驗 獲得超3個贊

事實證明我的問題具有完全不同的性質(zhì):我必須使用一個名為Transform3DGroup. 這是必須更改代碼以啟用繞 Z 軸旋轉(zhuǎn)的方式:


/* globals */

ModelVisual3D model; // initialized and model file loaded

Transform3DGroup tg = new Transform3DGroup();


private async void TimerEvent() 

{

    RotateTransform3D rot = new RotateTransform3D();

    QuaternionRotation3D q = new QuaternionRotation3D();


    double x = 0, y = 0, z = 0;


    List<Reading> results = await Device.ReadSensor();



    foreach (Reading r in results)

    {

        switch (r.Type)

        {

            case "RPF_SEN_ACCELX":

                x = r.Value;

                break;


            case "RPF_SEN_ACCELY":

                y = r.Value;

                break;


            case "RPF_SEN_ACCELZ":

                z = r.Value;

                angle = GetAngle(x, y).ToDegrees();

                q.Quaternion = new Quaternion(new Vector3D(0, 0, 1), angle);

                break;

        }


        rot.Rotation = q;


        tg.Children.Clear();

        tg.Children.Add(rot);


        model.Transform = tg; // Use Transform3DGroup!

    }

}

我還沒有找到任何關(guān)于強制使用Transform3DGroup.


為了完整起見,以下是Bill Wallis 在 Math Overflow 上GetAngle()得出的內(nèi)部結(jié)構(gòu):


private double GetAngle(double x, double y)

{

    if (x > 0)

    {

        return 2 * Math.PI - Math.Atan(y / x);

    }

    else if (x < 0)

    {

        return Math.PI - Math.Atan(y / x);

    }

    else // x == 0

    {

        return 2 * Math.PI - Math.Sign(y) * Math.PI / 2;

    }

}

以及 double 類型的擴展以在弧度和度數(shù)之間轉(zhuǎn)換雙精度數(shù)(類外,命名空間內(nèi)):


public static class NumericExtensions

{

    public static double ToRadians(this double val)

    {

        return (Math.PI / 180) * val;

    }

    public static double ToDegrees(this double val)

    {

        return (180 / Math.PI) * val;

    }

}


查看完整回答
反對 回復(fù) 2021-11-14
?
滄海一幻覺

TA貢獻1824條經(jīng)驗 獲得超5個贊

您的傳感器輸出旋轉(zhuǎn)值是累積的還是差異的?有時輸出旋轉(zhuǎn)是差異,您需要先前的旋轉(zhuǎn)值加上差異來計算當(dāng)前的新旋轉(zhuǎn)值。

您可以嘗試保存之前的四元數(shù)并將當(dāng)前四元數(shù)與之前的四元數(shù)相加,以獲得新的累積旋轉(zhuǎn)。


查看完整回答
反對 回復(fù) 2021-11-14
  • 2 回答
  • 0 關(guān)注
  • 299 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號