Unity - 使用 foreach 循环以及父对象和子对象进行 Lerp 旋转?
Unity - Lerp rotations with foreach loop and with parent and child objects?
我在 Unity 中有 3 个对象,它们是应该移动的手臂的 3 个部分。每个段还有 2 个空游戏对象,它们位于段的底部和顶部(这些用作关节,我想对其应用旋转)。在项目内部,这些对象如下所示:
a1_1 是手臂底部的主要关节,当它旋转时,所有东西都应该随之旋转(这就是它的父关节的原因)。 arm1、arm2 和 arm3 是段。 a2_1 和 a3_1 是另外两个添加旋转的关节。
现在我有一个 .txt 文件,每个关节都有多条角度线。我已经实现了一种读取此文件的方法,并且我正在使用 foreach 循环分别读取每一行。但是,当我使用 Quaternion.Lerp 函数时,它会添加奇怪的旋转,我真的不知道为什么。
我只想让关节旋转到一个特定点,等待 0.2 秒,然后旋转到下一个点。
IEnumerator Run() {
string[] tempAngles;
foreach (string line in angleArray) {
tempAngles = line.Split(' ');
a1_1.rotation = Quaternion.Lerp(a1_1.rotation, Quaternion.Euler(90 - float.Parse(tempAngles[1]), float.Parse(tempAngles[0]), 0), Time.fixedDeltaTime * 1f);
a2_1.rotation = Quaternion.Lerp(a2_1.rotation, Quaternion.Euler(180 - float.Parse(tempAngles[2]), 0, 0), Time.fixedDeltaTime * 1f);
a3_1.rotation = Quaternion.Lerp(a3_1.rotation, Quaternion.Euler(float.Parse(tempAngles[3]) + 45, 0, 0), Time.fixedDeltaTime * 1f);
//a1_1.rotation = a1_1.rotation * Quaternion.AngleAxis((90 - float.Parse(tempAngles[1]) * Time.fixedDeltaTime), Vector3.right);
//a1_1.Rotate(90 - float.Parse(tempAngles[1]), float.Parse(tempAngles[0]), 0);
//a2_1.Rotate(180 - float.Parse(tempAngles[2]), 0, 0);
//a3_1.Rotate(180 - float.Parse(tempAngles[3]), 0, 0);
yield return new WaitForSeconds(0.2f);
print("done");
}
}
到目前为止,这是该函数的样子。如您所见,我尝试了多种不同的方法来添加旋转,但 none 似乎按照我希望的方式工作。
这是一行角度在 txt 文件中的样子:
62.920341623781205 42.26008063439084 86.66333878215205 141.0765805834571
我将空格所在的每个角度分开,并在 foreach 循环中每步获得 4 个角度。
您需要将每个 lerp 开始时的初始旋转存储在一个变量中。例如,如果你想从 30 度 lerp 到 60 度,当你达到 40 时,a1_1.rotation 变成 40,但你仍然需要在第一个参数 lerp 函数中输入 30 才能正常工作。
https://docs.unity3d.com/ScriptReference/Quaternion.Lerp.html
这就是问题所在,但您可能也可能不需要使用 Transform.localRotation
我在 Unity 中有 3 个对象,它们是应该移动的手臂的 3 个部分。每个段还有 2 个空游戏对象,它们位于段的底部和顶部(这些用作关节,我想对其应用旋转)。在项目内部,这些对象如下所示:
a1_1 是手臂底部的主要关节,当它旋转时,所有东西都应该随之旋转(这就是它的父关节的原因)。 arm1、arm2 和 arm3 是段。 a2_1 和 a3_1 是另外两个添加旋转的关节。
现在我有一个 .txt 文件,每个关节都有多条角度线。我已经实现了一种读取此文件的方法,并且我正在使用 foreach 循环分别读取每一行。但是,当我使用 Quaternion.Lerp 函数时,它会添加奇怪的旋转,我真的不知道为什么。
我只想让关节旋转到一个特定点,等待 0.2 秒,然后旋转到下一个点。
IEnumerator Run() {
string[] tempAngles;
foreach (string line in angleArray) {
tempAngles = line.Split(' ');
a1_1.rotation = Quaternion.Lerp(a1_1.rotation, Quaternion.Euler(90 - float.Parse(tempAngles[1]), float.Parse(tempAngles[0]), 0), Time.fixedDeltaTime * 1f);
a2_1.rotation = Quaternion.Lerp(a2_1.rotation, Quaternion.Euler(180 - float.Parse(tempAngles[2]), 0, 0), Time.fixedDeltaTime * 1f);
a3_1.rotation = Quaternion.Lerp(a3_1.rotation, Quaternion.Euler(float.Parse(tempAngles[3]) + 45, 0, 0), Time.fixedDeltaTime * 1f);
//a1_1.rotation = a1_1.rotation * Quaternion.AngleAxis((90 - float.Parse(tempAngles[1]) * Time.fixedDeltaTime), Vector3.right);
//a1_1.Rotate(90 - float.Parse(tempAngles[1]), float.Parse(tempAngles[0]), 0);
//a2_1.Rotate(180 - float.Parse(tempAngles[2]), 0, 0);
//a3_1.Rotate(180 - float.Parse(tempAngles[3]), 0, 0);
yield return new WaitForSeconds(0.2f);
print("done");
}
}
到目前为止,这是该函数的样子。如您所见,我尝试了多种不同的方法来添加旋转,但 none 似乎按照我希望的方式工作。
这是一行角度在 txt 文件中的样子:
62.920341623781205 42.26008063439084 86.66333878215205 141.0765805834571
我将空格所在的每个角度分开,并在 foreach 循环中每步获得 4 个角度。
您需要将每个 lerp 开始时的初始旋转存储在一个变量中。例如,如果你想从 30 度 lerp 到 60 度,当你达到 40 时,a1_1.rotation 变成 40,但你仍然需要在第一个参数 lerp 函数中输入 30 才能正常工作。 https://docs.unity3d.com/ScriptReference/Quaternion.Lerp.html
这就是问题所在,但您可能也可能不需要使用 Transform.localRotation