Unity - 使用 foreach 循环以及父对象和子对象进行 Lerp 旋转?
Posted
技术标签:
【中文标题】Unity - 使用 foreach 循环以及父对象和子对象进行 Lerp 旋转?【英文标题】:Unity - Lerp rotations with foreach loop and with parent and child objects? 【发布时间】:2021-09-04 11:51:57 【问题描述】:我在 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");
这是该函数目前的样子。如您所见,我尝试了多种不同的方法来添加轮换,但似乎没有一种方法能按我希望的方式工作。
这是txt文件中一行角度的样子:
62.920341623781205 42.26008063439084 86.66333878215205 141.0765805834571
我将空格所在的每个角度分开,并在 foreach 循环中每步得到 4 个角度。
【问题讨论】:
***.com/help/someone-answers 【参考方案1】:您需要将每个 lerp 开头的初始旋转存储在一个变量中。例如,如果你想从 30 度到 60 度,当你达到 40 度后,a1_1.rotation 变为 40,但你仍然需要将 30 放入第一个参数 lerp 函数中才能正常工作。 https://docs.unity3d.com/ScriptReference/Quaternion.Lerp.html
这是这里的问题,但您可能需要也可能不需要使用 Transform.localRotation
【讨论】:
以上是关于Unity - 使用 foreach 循环以及父对象和子对象进行 Lerp 旋转?的主要内容,如果未能解决你的问题,请参考以下文章