Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity 3D旋转不工作我想需要一个阈值_C#_Unity3d - Fatal编程技术网

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特别要求一个阈值:)