代码之家  ›  专栏  ›  技术社区  ›  SW Jeong

使用统一的四元数渲染对象的方向

  •  0
  • SW Jeong  · 技术社区  · 6 年前

    我正在尝试渲染四元数数据,这些数据是从单个IMU输出的9DOF数据计算出来的。

    然而,我找不到这个C#脚本的明确而简单的例子。这是到目前为止我的代码,但看起来unity中显示的对象一直在一个方向上变戏法。

    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 回复  |  直到 6 年前
        1
  •  2
  •   derHugo    6 年前

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

    这不是个好主意。 Euler Quaternion Quaternion.Euler ,从另一个方向 欧拉 q.eulerAngles 不总是返回相同的值,因为 在中可以有多个(可能是无限的)表示形式 欧拉 !

    四元数 (假设你 x , y , z w 值是正确的)不要使用任何 欧拉 .

    通过乘法将两个旋转连接起来

    quaternionA * quaternionB
    

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


    所以如果你想 添加 轮换使用

    transform.rotation *= q;
    

    如果你想 设置 旋转只需使用

    transform.rotation = q;