在 Unity 中使用四元数渲染对象的方向
Rendering orientation of an object with quaternion in Unity
我正在尝试渲染根据来自单个 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++)
{
}
}
}
}
这个
Quaternion q = new Quaternion(x, y, z, w);
transform.Rotate(q.eulerAngles);
不是个好主意。
虽然从 Euler
到 Quaternion
的方向总是在 Quaternion.Euler
中有效,但从 Quaternion
到 Euler
的方向使用 q.eulerAngles
并不总是有效return 相同的值,因为 Quaternion
在 Euler
!
中可以有多个(可能是无限个?)表示
因此,如果您已经有了 Quaternion
(假设您的 x
、y
、z
、w
值正确),请不要使用任意 Euler
.
你确实通过乘法连接了两个旋转
quaternionA * quaternionB
(注意不同于浮点乘法,这是矩阵乘法,因此顺序很重要!)
所以如果你想添加旋转使用
transform.rotation *= q;
如果你想设置旋转只需使用
transform.rotation = q;
我正在尝试渲染根据来自单个 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++)
{
}
}
}
}
这个
Quaternion q = new Quaternion(x, y, z, w);
transform.Rotate(q.eulerAngles);
不是个好主意。
虽然从 Euler
到 Quaternion
的方向总是在 Quaternion.Euler
中有效,但从 Quaternion
到 Euler
的方向使用 q.eulerAngles
并不总是有效return 相同的值,因为 Quaternion
在 Euler
!
因此,如果您已经有了 Quaternion
(假设您的 x
、y
、z
、w
值正确),请不要使用任意 Euler
.
你确实通过乘法连接了两个旋转
quaternionA * quaternionB
(注意不同于浮点乘法,这是矩阵乘法,因此顺序很重要!)
所以如果你想添加旋转使用
transform.rotation *= q;
如果你想设置旋转只需使用
transform.rotation = q;