【问题标题】:issues rotating an arbitrary point around another arbitrary point [duplicate]问题围绕另一个任意点旋转任意点[重复]
【发布时间】:2018-12-06 14:05:24
【问题描述】:

我编写了以下方法,在一段时间内将任意点围绕另一个任意点旋转一个角度。有问题的点现在移动不规律,但最终在我认为是理想目的地的地方结束。我需要让它平稳地移动到这个角度。

请注意,积分与游戏对象无关。

从下图中,我试图在给定的时间段内将贝塞尔曲线的一个点(用LineRenderer 绘制)围绕另一个点移动一个角度。这些点都不与包含贝塞尔曲线的游戏对象的位置重合。

IEnumerator runMovement()  {

    yield return new WaitForSeconds(2.0f);
    Vector2 pivot = points[3];

    StartCoroutine(RotateControlPointWithDuration(pivot, 2.0f, 90.0f));

}

   IEnumerator RotateControlPointWithDuration(Vector2 pivot, float duration, float angle)
{
    float currentTime = 0.0f;
    float ourTimeDelta = 0;
    Vector2 startPos = points[0];

    ourTimeDelta = Time.deltaTime;
    float angleDelta = angle / duration; //how many degress to rotate in one second

    while (currentTime < duration)
    {
        currentTime += Time.deltaTime;
        ourTimeDelta = Time.deltaTime;

        points[0] = new Vector2(Mathf.Cos(angleDelta * ourTimeDelta) * (startPos.x - pivot.x) - Mathf.Sin(angleDelta * ourTimeDelta) * (startPos.y - pivot.y) + pivot.x,
                                                        Mathf.Sin(angleDelta * ourTimeDelta) * (startPos.x - pivot.x) + Mathf.Cos(angleDelta * ourTimeDelta) * (startPos.y - pivot.y) + pivot.y);

        yield return null;
    }
}

【问题讨论】:

  • 我建议您添加动画 gif 或链接到显示您当前问题的视频。此外,最好添加另一个视频来显示您正在尝试做什么
  • 另外,听听@Programmer 所说的一切:)
  • @Fattie 我正在处理更新,很快就会准备好
  • @Programmer 我刚刚更新了问题
  • @Fattie 仍然有一些不稳定的动作。我刚刚更新了这个问题。老实说,我认为这个问题与您提供的链接有很多不同之处。

标签: c# unity3d


【解决方案1】:

你想要的图案就是

public IEnumerator HowToSmoothly()
    {
    // move "X" from value "A" to value "B"

    float duration = 2.5f;
    float delta = B - A;

    float startTime = Time.time;
    float finishTime = Time.time+duration;

    while(Time.time<finishTime)
        {

        float soFarTime = Time.time-startTime;
        float fractionThisFrame = soFarTime / duration;
        float valueThisFrame = A + delta * fractionThisFrame;

        X = valueThisFrame
        if (X > B) X = B;

        yield return 0;
        }

    X = B;
    yield break;
    }

【讨论】:

    【解决方案2】:

    我真的可以为你提供很多关于 quartonians 的帮助,但我可以提供一些关于随着时间的推移而移动的建议。我必须学习的艰难教训是尽可能避免使用协同程序。虽然它们看起来很漂亮,但要正确使用它们有点令人困惑,而且 Unity 使用它们的方式并不完全是您应该在 C# 的其他领域使用它们的方式。

    只要有可能,我只使用一个更新每一帧的统一类。它更易于理解和调试。您的情况的缺点是您尝试旋转的每个点都需要一个新组件,但这应该没什么大不了的。

    public class PointRotator : MonoBehaviour
    

    {

    bool rotating = false;
    float rate = 0;
    float angle;
    
    Vector3 point;
    Vector3 pivot;
    
    public void Rotate(Vector3 point, Vector3 pivot, float duration, float angle)
    {
        this.point = point;
        this.pivot = pivot;
        this.rate = angle/duration;
        this.angle = angle;
    
        rotating = true;
    }
    
    public void Update()
    {
        if (rotating)
        {
            // use quartonian.Lerp with Time.deltatime here
    
        //if(angle > quartonian angle){rotating = false)
        }
    }
    

    }

    尝试类似的方法,看看您的问题是否会消失。否则,您可能需要更多地研究四元数,或者因为您在 2D 平面中,所以只需手动执行三角函数。

    【讨论】:

    • 我要对几个点的轮换进行计时,它们最终可能会达到数百个,我现在还不能确定。这是我想使用协程的另一个原因。
    • @TenOutOfTen,除非您用一两句话解释您要做什么,否则无法为您提供更多帮助。干杯
    • 你考虑过制作积分游戏对象吗?这真的会简化解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多