【问题标题】:why does the orientation of my object change in unity?为什么我的对象的方向统一改变?
【发布时间】:2019-05-27 12:03:08
【问题描述】:

我在 Unity 中有一个模型,我想使用 IMU 给出的四元数来旋转它。要更改方向,我需要将对象的初始方向四元数(=Qreset)设置为 IMU 的方向(=Qimu),然后计算 Qreset 和 Qimu 之间的差异以获得新的方向。它可以工作,但是每当我设置初始方向(Qreset)时,Unity 中对象的方向总是会改变(X:-180.4,Y:21.08,Z:21.08)。我不知道为什么会这样。我如何更改此设置,以便重置时的对象方向始终为 0,0,0。这是我的代码:

void Update() {

if (Input.GetKeyDown(KeyCode.Space))
   {
      Qreset = Qimu;
   }
   transform.rotation = Qreset * Quaternion.inverse(Qimu);
}

void Splitstring(string msg)
{
    string[] values = msg.Split('+');    
    Qimu.x = float.Parse(values[1]);
    Qimu.y = float.Parse(values[2]);
    Qimu.z = float.Parse(values[3]);
    Qimu.w = float.Parse(values[0]);
}

【问题讨论】:

  • 请注意transform.rotationtransform.localRotation 之间存在差异...您在检查器中看到的始终是localRotation,它是相对于父对象的旋转。您可能想尝试设置localRotation
  • 此外,由于四元数存在的约束,通过独立设置其x,y,z,w 参数并一个接一个地更改四元数可能会导致四元数不等于(x,y,z,w)。即x*y*z 必须始终等于-1。考虑使用new Quaternion(x,y,z,w)quaternion.Set(x,y,z,w)
  • @derHugo 就是这样!谢谢!

标签: unity3d 3d orientation quaternions


【解决方案1】:

rotation有区别

存储为四元数的世界空间中变换的旋转。

localRotation

变换相对于父变换旋转的旋转。

并注意在Transform Inspector

Transform 的位置、旋转和缩放值是相对于 Transform 的父级测量的。如果 Transform 没有父级,则在世界空间中测量属性。

=> 您在 Inspector 中看到的通常是 localRotation

因此,如果您的对象嵌套在您要设置的Qimu

transform.localRotation = Qreset * Quaternion.inverse(Qimu);

还要注意 Draco18s 关于检索四元数的评论。你宁愿这样做

void Splitstring(string msg)
{
    string[] values = msg.Split('+');    
    var x = float.Parse(values[1]);
    var y = float.Parse(values[2]);
    var z = float.Parse(values[3]);
    var w = float.Parse(values[0]);

    Qimu = new Quaternion(x, y, z, w);
}

【讨论】:

    猜你喜欢
    • 2022-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多