Unity中具有四元数的对象的渲染方向

时间:2018-11-28 02:13:02

标签: unity3d quaternions

我正在尝试渲染从单个IMU发出的9DOF数据计算得出的四元数数据。

但是,我找不到此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 :(得分:2)

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

不是一个好主意。 虽然从EulerQuaternion的方向始终在Quaternion.Euler中起作用,但是使用QuaternionEulerq.eulerAngles的相反方法却并非总是如此之所以返回相同的值,是因为QuaternionEuler中可以有多个(也许是无限的?)表示形式!

因此,如果您已经拥有Quaternion(假设您的xyzw值正确),请不要使用任何{ {1}}。

您确实通过乘法将两个旋转合并在一起

Euler

(与浮点乘法不同,这是矩阵乘法,因此顺序很重要!)


因此,如果您要添加轮换使用

quaternionA * quaternionB

如果要设置轮换,只需使用

transform.rotation *= q;