检查器中显示哪个旋转?

时间:2019-02-07 21:29:18

标签: unity3d

我的玩家的胸骨可以在瞄准时旋转。

现在我想评估一下我应该让胸部旋转多少(最小和最大旋转)。

为此,我允许所有旋转角度并查看了Inspector。

例如,胸部应向左旋转的最小值应为Y = -15。 在Y = -15(在检查器中看到)时,它看起来仍然很自然。

现在我想对此进行编码。

令我惊讶的是,Chest.localRotation.Y与检查器显示的值完全不同。

然后我看了看胸部变量并扩大了视野。 我只是看不到检查器显示的旋转值。

在这种情况下,我应该如何继续?

我正在使用它来旋转骨骼:

Chest.LookAt(ChestLookTarget.position); 
Chest.rotation = Chest.rotation * Quaternion.Euler(Offset);

谢谢! enter image description here

1 个答案:

答案 0 :(得分:1)

它不起作用的原因:

Quaternion不是人类可读的值。

一个Quaternion始终是唯一的,但在Euler空间中可以有多个(无限?)不同的表示形式!另一种方法是Euler始终精确地表示一个Quaternion值。

如果查看文档,它会明确显示

  

除非您完全了解四元数,否则请不要直接修改它。


正如您所说,您在检查器中看到的是相对于父级Transform的{​​{3}}。

更好地表示,这是产生Euler的众多可能的Quaternion输入之一。您在localRotation的调试中看到的是另一种可能的Euler表示形式。通常,localEulerAngles中的Unity也只给您提供值> 0


似乎胸部始终只会绕Y轴旋转,对吧?

如果是这种情况,您可以简单地获得胸部原始正向向量与目标之间的夹角。比Vector3更容易处理Quaternion值;)

似乎与localEulerAngles中的用例相同

// get the target direction
Vector3 targetDir = ChestLookTarget.position - Chest.position;

// Reset any difference in the Y axis
// since it would change the angle as well if there was a difference I the height
// between the two objects
targetDir.y = 0;

// however you currently rotate
// instead rotate only the Vector3 variable without applying it to the transform yet
Vector3 newDir = Vector3.RotateTowards(Chest.forward, targetDir, RotationSpeed * Time.deltaTime, 0.0f);

// Compare the target direction to the parents forward vector
float newAngle = Vector3.Angle(Chest.parent.transform.forward, newDir);

if (newAngle > MaxRotationAngle)
{
    // What should happen if angle gets bigger?
    return;
}

// If angle still okey set the new direction
Chest.rotation = Quaternion.LookRotation(newDir);