了解Unity中的四元数

问题描述 投票:-3回答:1

在理解如何在Unity中使用旋转(用四元数表示)时遇到了一些困难。

我想做的是记录一个物体在某个时间的旋转,然后在不久之后找出它的新旋转,并将其转化为在世界空间中围绕X、Y和Z轴旋转了多少度(或弧度)。

我相信这很简单......。

c# unity3d quaternions euler-angles
1个回答
2
投票

你可以得到两个之间的差异 Quaternion 借用 Quaternion.Inverse* 经营者

首先将旋转存储在一个字段中

private Quaternion lastRotation;

// E.g. at the beginning
private void Awake()
{
    lastRotation = transform.rotation;
}

然后再在某个地方做例如

Quaternion currentRotation = transform.rotation;
Quaternion delta = Quaternion.Inverse(beforeRotation) * currentRotation;
// and update lastRotation for the next check
lastRotation = currentRotation;

然后你就可以得到欧拉轴角的表示方法,用 Quaternion.eulerAngles

var deltaInEulers = delta.eulerAngles;
Debug.Log($"Rotated about {deltaInEulers}");

2
投票

在3D软件中使用四元数的原因之一是避免 "万向节锁定"。欧拉角的任何旋转都是围绕X、Y、Z这三个固定轴进行的3次独立旋转,而四元数则是围绕单一轴进行旋转,它在空间中是自由定向的。四元数.角轴(Quaternion.AngleAxis) 可以给你这个Vetor3轴,以及旋转角度(实际上,四元组由Vector3(X,Y,Z)和角度W组成,一般来说)。所以一个四元数的旋转可以用几个不同的欧拉旋转来表示。

要做你想做的事,你需要首先得到四元数,代表旋转差,而不是实际的旋转。它可以用 四元数.FromToRotation,它使用变换的正向和向上向量作为输入。然后你可以使用 四元组.欧拉角.

© www.soinside.com 2019 - 2024. All rights reserved.