C# 单位四元数-获取组件B相对于组件a的欧拉角

C# 单位四元数-获取组件B相对于组件a的欧拉角,c#,unity3d,quaternions,euler-angles,C#,Unity3d,Quaternions,Euler Angles,我无法理解四元数,在阅读/查看教程后,我尝试了许多关于四元数的运算符组合。没有成功-只是表明我缺乏理解。甚至尝试过角度和atan2()-但真正让我看到的是万向节锁是什么。我试图解决的问题是: 我有一个组件(比如一个立方体),在世界参照系中有一些旋转(实际上,旋转是什么并不重要,可以朝向任何方向) 然后我在世界空间的其他地方有另一个组件(比如B,另一个立方体)。该组件的旋转是什么也不重要 最后我想得到的是B相对于A的(欧拉)角,但是相对于A的参考系,而不是世界空间。原因是我想根据B从A的方向向A添

我无法理解四元数,在阅读/查看教程后,我尝试了许多关于四元数的运算符组合。没有成功-只是表明我缺乏理解。甚至尝试过角度和atan2()-但真正让我看到的是万向节锁是什么。我试图解决的问题是:

我有一个组件(比如一个立方体),在世界参照系中有一些旋转(实际上,旋转是什么并不重要,可以朝向任何方向)

然后我在世界空间的其他地方有另一个组件(比如B,另一个立方体)。该组件的旋转是什么也不重要

最后我想得到的是B相对于A的(欧拉)角,但是相对于A的参考系,而不是世界空间。原因是我想根据B从A的方向向A添加力,然后我可以使用
A.rigidbody.addRelativeForce(x,y,z)


卡住了。

谢谢你的评论,我想我已经找到了

作为参考,考虑到同一(世界帧)坐标内的矢量和旋转,表示原始(但从局部帧坐标的角度来看)的新矢量,即原始世界旋转的矢量,可计算为:

static Vector3 createVectorForLocalRotationFrame(Vector3 worldVector, Quaternion worldRotation, bool normalise)
{
    Vector3 localVector = Quaternion.Inverse(worldRotation) * worldVector;

    if (normalise)
        localVector.Normalize();

    return localVector;                                                             
}

正常化选项正是我所需要的。不要问我它是如何工作的,但它似乎是正确的。

你能用像A.transform.InverseTransformDirection或A.transform.InverseTransformVector这样的东西吗?你试过看吗?