Визуализация ориентации объекта с кватернионом в Unity - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь отобразить кватернионные данные, рассчитанные на основе данных 9DOF, поступающих из одного IMU.

Однако я не смог найти явный и простой пример для этого сценария C #.Вот мой код, но кажется, что объект, показанный в единстве, продолжает жонглировать в одном направлении.

Вот код.Я хотел бы знать, что я здесь не так.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using System.IO;
using System;

public class Motion : MonoBehaviour {
public float speed = 0.00001f;
public float x;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
    x += Time.deltaTime * 10;
    // transform.Translate(-Input.GetAxis("Horizontal") * speed * Time.deltaTime, 0, 0);
    // transform.rotation = Quaternion.Euler(x, 0, 0);

    var reader = new StreamReader(@"F:\MovTrack\C++ Implementation Sensor Fusion Library\MovTrack_Processor\Sensor Fusion\Sensor Fusion\Q_Output.csv");

    while(!reader.EndOfStream)
    {
        var line = reader.ReadLine();
        var values = line.Split(',');

        float x = float.Parse(values[0]);
        float y = float.Parse(values[1]);
        float z = float.Parse(values[2]);
        float w = float.Parse(values[3]);

        //Console.Out.WriteLine(x + "  " + y + "   " + z + "  " + w);

        Quaternion q = new Quaternion(x, y, z, w);
        transform.Rotate(q.eulerAngles);
        for(int i = 0; i < 1; i++)
        {

        }
    }
}

}

1 Ответ

0 голосов
/ 28 ноября 2018

Это

Quaternion q = new Quaternion(x, y, z, w);
transform.Rotate(q.eulerAngles);

не очень хорошая идея.Хотя направление от Euler до Quaternion всегда работает в Quaternion.Euler, обратное направление от Quaternion до Euler с использованием q.eulerAngles не всегда возвращает одно и то же значение, поскольку Quaternion может иметь несколько(может быть, бесконечное число?) представлений в Euler!

Так что, если у вас уже есть Quaternion (при условии, что ваши значения x, y, z, w верны) don 't использовать любое Euler.

Вы умножаете два поворота умножением

quaternionA * quaternionB

(осторожно отличается от, например, умножения с плавающей точкой, это умножение матрицы, и поэтому порядок имеет значение!)


Итак, если вы хотите добавить , используйте вращение

transform.rotation *= q;

, если вы хотите установите , вращение просто используйте

transform.rotation = q;
...