在 Unity 中获取旋转的特定部分

问题描述 投票:0回答:2

我正在尝试使用 Unity 实现齿轮物理,但遇到了问题。我编写了以下代码,让一个齿轮跟随另一个齿轮。

Quaternion targetRot = Quaternion.Inverse(Quaternion.Euler(targetGear.RelativeRotation.eulerAngles * ratio));
transform.rotation = _startRotation * targetRot;

如果比例不大于1,则工作顺利,但当比例大于1时,物体右轴旋转180度。例如。

enter image description here

当我像示例中那样将旋转减半时,我希望较大的齿轮进行完整旋转。我怎样才能实现这个目标?

c# unity-game-engine rotation quaternions euler-angles
2个回答
0
投票

为什么要经过欧拉角(万向节锁)?

而是直接坚持

Quaternion

您可以使用

Quaternion.SlerpUnclamped

代替比率乘法
// this interpolates between identity ("no change") and your relative rotation
// by doing this unclamped it basically equals multiplying by the ratio
var targetRot = Quaternion.Inverse(Quaternion.SlerpUnclamped(Quaternion.identity, targetGear.RelativeRotation, ratio));
transform.rotation = _startRotation * targetRot;

0
投票

假设您有两个围绕 Z 轴旋转的齿轮。 第一个齿轮绕该轴旋转 X 度。 (欧拉:0,X,0)

第二个齿轮将绕 z 轴沿相反方向旋转 X * gearRatio。相反方向,意味着负度数(相对于第一齿轮的旋转)。 (欧拉: 0,-X *比率,0)

由于我们知道 Quatenion.Euler 将正确处理负度数和超过 360 度的度数,因此我将使用它来进行计算。 所以,我会用:

Quaternion targetRot = Quaternion.Euler(follow.localRotation.eulerAngles * ration * -1);
transform.localRotation = _startRotation * targetRot;

小心!如果您的齿轮绕其旋转轴以外的任何轴旋转,它们也将是倒置的。因此,请确保使用其父变换而不是“齿轮旋转”变换在世界空间中定向齿轮。 (这就是为什么我建议使用 localRotation,而不是常规旋转。)

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