Unity3D:不知道如何使用 Quaternion.Slerp();旋转变得更快
Unity3D: no idea how to use Quaternion.Slerp(); rotation becomes faster
我正在尝试在 Unity 中为 GearVR 制作一个简单的游戏。在游戏中,我有一个场景,用户可以在其中浏览项目列表。如果用户在查看某个项目时单击,则可以选择该项目。对于导航部分,用户应该能够同时使用头部移动和滑动来旋转项目(每 right/left 滑动移动 one/minus 一个)。
现在的问题是:我可以使用下面的代码(设置为项目父项的组件)完成所有这些工作,但是随着我使用滑动次数的增加,旋转不断增加。我似乎无法弄清楚为什么......仍在努力。
感谢任何形式的帮助 XD
private void ManageSwipe(VRInput.SwipeDirection sw)
{
from = transform.rotation;
if (sw == VRInput.SwipeDirection.LEFT)
{
to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y + 30, 0));
}
if (sw == VRInput.SwipeDirection.RIGHT)
{
to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y - 30, 0));
}
StartCoroutine(Rotate());
}
IEnumerator Rotate(bool v)
{
while (true)
{
transform.rotation = Quaternion.Slerp(from, to, Time.deltaTime);
yield return null;
}
}
我使用的是 Unity 5.4.1f1 和 jdk 1.8.0.
PS。不要对我太苛刻,因为这是我的第一个问题。
对了...大家好XD
尝试使用当前旋转而不是最后一个旋转的 Lerp:
transform.rotation = Quaternion.Slerp(transform.rotation, to, Time.deltaTime);
你解决了我在评论部分讨论的大部分问题。剩下的一件事仍然是 while 循环。现在,没有办法退出 while 循环,这将导致同时出现旋转函数 运行 的多个实例。
but the rotation keeps increasing the more I use swipes
解决方案是存储对一个协程函数的引用,然后在启动一个新协程函数之前停止它。
像这样。
IEnumerator lastCoroutine;
lastCoroutine = Rotate();
...
StopCoroutine(lastCoroutine);
StartCoroutine(lastCoroutine);
而不是 while (true)
,您应该有一个存在 while 循环的计时器。此时Rotate
函数连续运行。从旋转移动到目标旋转后,您应该让它停止。
像这样的东西应该可以工作:
while (counter < duration)
{
counter += Time.deltaTime;
transform.rotation = Quaternion.Lerp(from, to, counter / duration);
yield return null;
}
您的整个代码应该如下所示:
IEnumerator lastCoroutine;
void Start()
{
lastCoroutine = Rotate();
}
private void ManageSwipe(VRInput.SwipeDirection sw)
{
//from = transform.rotation;
if (sw == VRInput.SwipeDirection.LEFT)
{
to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y + 30, 0));
}
if (sw == VRInput.SwipeDirection.RIGHT)
{
to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y - 30, 0));
}
//Stop old coroutine
StopCoroutine(lastCoroutine);
//Now start new Coroutine
StartCoroutine(lastCoroutine);
}
IEnumerator Rotate()
{
const float duration = 2f; //Seconds it should take to finish rotating
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
transform.rotation = Quaternion.Lerp(from, to, counter / duration);
yield return null;
}
}
您可以增加或减少 duration
变量。
我正在尝试在 Unity 中为 GearVR 制作一个简单的游戏。在游戏中,我有一个场景,用户可以在其中浏览项目列表。如果用户在查看某个项目时单击,则可以选择该项目。对于导航部分,用户应该能够同时使用头部移动和滑动来旋转项目(每 right/left 滑动移动 one/minus 一个)。
现在的问题是:我可以使用下面的代码(设置为项目父项的组件)完成所有这些工作,但是随着我使用滑动次数的增加,旋转不断增加。我似乎无法弄清楚为什么......仍在努力。
感谢任何形式的帮助 XD
private void ManageSwipe(VRInput.SwipeDirection sw)
{
from = transform.rotation;
if (sw == VRInput.SwipeDirection.LEFT)
{
to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y + 30, 0));
}
if (sw == VRInput.SwipeDirection.RIGHT)
{
to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y - 30, 0));
}
StartCoroutine(Rotate());
}
IEnumerator Rotate(bool v)
{
while (true)
{
transform.rotation = Quaternion.Slerp(from, to, Time.deltaTime);
yield return null;
}
}
我使用的是 Unity 5.4.1f1 和 jdk 1.8.0.
PS。不要对我太苛刻,因为这是我的第一个问题。
对了...大家好XD
尝试使用当前旋转而不是最后一个旋转的 Lerp:
transform.rotation = Quaternion.Slerp(transform.rotation, to, Time.deltaTime);
你解决了我在评论部分讨论的大部分问题。剩下的一件事仍然是 while 循环。现在,没有办法退出 while 循环,这将导致同时出现旋转函数 运行 的多个实例。
but the rotation keeps increasing the more I use swipes
解决方案是存储对一个协程函数的引用,然后在启动一个新协程函数之前停止它。
像这样。
IEnumerator lastCoroutine;
lastCoroutine = Rotate();
...
StopCoroutine(lastCoroutine);
StartCoroutine(lastCoroutine);
而不是 while (true)
,您应该有一个存在 while 循环的计时器。此时Rotate
函数连续运行。从旋转移动到目标旋转后,您应该让它停止。
像这样的东西应该可以工作:
while (counter < duration)
{
counter += Time.deltaTime;
transform.rotation = Quaternion.Lerp(from, to, counter / duration);
yield return null;
}
您的整个代码应该如下所示:
IEnumerator lastCoroutine;
void Start()
{
lastCoroutine = Rotate();
}
private void ManageSwipe(VRInput.SwipeDirection sw)
{
//from = transform.rotation;
if (sw == VRInput.SwipeDirection.LEFT)
{
to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y + 30, 0));
}
if (sw == VRInput.SwipeDirection.RIGHT)
{
to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y - 30, 0));
}
//Stop old coroutine
StopCoroutine(lastCoroutine);
//Now start new Coroutine
StartCoroutine(lastCoroutine);
}
IEnumerator Rotate()
{
const float duration = 2f; //Seconds it should take to finish rotating
float counter = 0;
while (counter < duration)
{
counter += Time.deltaTime;
transform.rotation = Quaternion.Lerp(from, to, counter / duration);
yield return null;
}
}
您可以增加或减少 duration
变量。