C# Unity 3D旋转不工作我想需要一个阈值
我有下面的代码,它以平滑的速率向目标点旋转一个对象C# Unity 3D旋转不工作我想需要一个阈值,c#,unity3d,C#,Unity3d,我有下面的代码,它以平滑的速率向目标点旋转一个对象 public bool RotatedTowards(Vector3 lookAtPoint, float deltaTime) { flatDirPath = Vector3.Scale((lookAtPoint - transform.position), new Vector3(1, 0, 1)); targetRotation = Quaternion.LookRotation(flatDirPath, Vector3.
public bool RotatedTowards(Vector3 lookAtPoint, float deltaTime)
{
flatDirPath = Vector3.Scale((lookAtPoint - transform.position), new Vector3(1, 0, 1));
targetRotation = Quaternion.LookRotation(flatDirPath, Vector3.up);
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, deltaTime * basicProperties.turnRate);
if (Vector3.Dot(flatDirPath.normalized, transform.forward) >= 0.9f)
{
return true;
}
else
{
return false;
}
}
它工作得很好,问题是如果我右击一个点,移动得非常快(告诉这个物体以非常高的频率向一个非常相似但不同的观察点旋转),这个物体在不断地进行小的旋转变化时会轻微地抖动(我相信就是这样发生的)
我认为,最好的解决方案可能是仅在目标点距离对象前面超过阈值时进行transform.rotation,比如说,距离对象已经面对的方向的左侧或右侧至少1度。我如何测试这个?如果低于1度,没有点朝着它旋转,这应该可以消除快速点击同一点时产生的震动。我希望如此
感谢您的帮助。谢谢您可以使用:
在代码中:
public bool RotatedTowards(Vector3 lookAtPoint, float deltaTime)
{
flatDirPath = Vector3.Scale((lookAtPoint - transform.position), new Vector3(1, 0, 1));
targetRotation = Quaternion.LookRotation(flatDirPath, Vector3.up);
float angle = Quaternion.Angle(transform.rotation, targetRotation);
float threshold = 1;
if(Mathf.Abs(angle) > threshold)
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, deltaTime * basicProperties.turnRate);
return (Vector3.Dot(flatDirPath.normalized, transform.forward) >= 0.9f);
}
如果您不喜欢此阈值的行为,可以尝试其他方法:
使用
Queue
存储最后几个flatDirPath
向量(例如,最后10个),然后每次添加一个新向量,每次删除最旧的向量-然后计算队列中所有向量的平均向量,并在四元数中使用该向量。LookRotation
-您应该获得更平滑的行为。如果队列中存储了更多向量,则旋转将稍微滞后,因此使用4-6个向量可获得更快的响应,或使用10-20个向量可获得更平滑的响应。仅作一般性评论:您应该将最后一个if
块替换为返回向量3.Dot(flatDirPath.normalized,transform.forward)>=0.9f
是的,这样会更有效,谢谢。顺便说一句,我试过使用Vector3.Angle(transform.forward,flatDirPath.normalized),但它不起作用,得到的结果与基本相同的点非常不一致,有时为0.05度,有时为178度,有时为10度。尽管如此,我还是要试试运气。您是否确实需要检查Mathf.Abs(角度)>阈值
?doc指定“但注意旋转不会超过”@Someprogammer您可以尝试不使用它,但OP特别要求一个阈值:)