c# - 使用Verlet方法在unity2d中绘制火鸡

标签 c# unity3d verlet-integration

这是一道作业题(不要复制,复制不聪明):我们需要在unity 2d中绘制一个2d的火鸡,使用Verlet的方法来更新顶点的位置。但是,我们不知道追踪土耳其的相关力量。这是火鸡的照片。有窍门吗? enter image description here

这是我们开始的代码:

public class GenerateTurkeys : MonoBehaviour
{

    LineRenderer lineRenderer = gameObject.AddComponent<LineRenderer>();
    // Start is called before the first frame update
    int numberOfTurkeys;
    int NUM_PARTICLES;
    float fTimeStep;
    Vector3[] m_position = new Vector3[NUM_PARTICLES];
    Vector3[] m_acceleration = new Vector3[NUM_PARTICLES];
    Vector3[] m_oldPosition = new Vector3[NUM_PARTICLES];



    void Start()
    {
        NUM_PARTICLES = 100;
        numberOfTurkeys = 0;


    }
    // Verlet integration step void ParticleSystem::
    Verlet()
    {
        for (int i=0; i<NUM_PARTICLES; i++)
        {
            Vector3  x = m_position[i];
            Vector3 temp = x;
            Vector3 oldx = m_oldPosition[i];
            Vector3 a = m_acceleration[i];
            x += x-oldx+a* fTimeStep*fTimeStep;
            oldx = temp;
        }
    }
    void DrawLine(float[] heights)
    {

        LineRenderer lineRenderer = GetComponent<LineRenderer>();
        var t = Time.time;

        for (int i = 0; i < NUM_PARTICLES; i++)
        {

            lineRenderer.SetPosition(i, );
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
}

最佳答案

我不确定我的决定是否正确,因为轮廓不匹配,但在解决方案中速度完全是迭代的。我认为这是 Unity 中物理上的一个小错误,因为如果你使用由此产生的加速度,你可以非常准确地绘制图形。

enter image description here

代码如下:

public class Drawer : MonoBehaviour
{
    [SerializeField]
    private Transform[] m_Dots;

    private Rigidbody2D m_Dot;
    private Vector2[] m_Acceler;
    float deltaT = 0.5f;//for example

    private void Start()
    {
        m_Acceler = GetAcceler();

        var go = new GameObject("Tracer");
        var tr = go.AddComponent<TrailRenderer>();
        tr.widthMultiplier = 0.1f;
        tr.time = 50f;
        m_Dot = go.AddComponent<Rigidbody2D>();
        m_Dot.bodyType = RigidbodyType2D.Kinematic;
        m_Dot.gravityScale = 0;

        StartCoroutine(VerletCoroutine());
    }

    private Vector2[] GetAcceler()
    {
        Vector2[] result = new Vector2[m_Dots.Length];
        float T = deltaT;

        int len = m_Dots.Length;
        result[0] = An(m_Dots[1].position, m_Dots[0].position, m_Dots[0].position, T);
        for (int i = 1 ; i < len - 1 ; i++, T += deltaT)
        {
            result[i] = An(m_Dots[i + 1].position, m_Dots[i].position, m_Dots[i].position, T);
        }

        result[len - 1] = An(m_Dots[0].position, m_Dots[len - 1].position, m_Dots[len - 1].position, T);
        return result;
    }

    private Vector2 An(Vector2 Xnext, Vector2 Xn, Vector2 Xprev, float t)
    {// a[n] = (x[n+1] - 2*x[n]+x[n-1])/t^2
        return (Xnext - 2 * Xn + Xprev) / t * t;
    }

    private IEnumerator VerletCoroutine()
    {
        m_Dot.transform.position = m_Dots[0].position;
        Vector2 Vprev = Vector2.zero;
        int len = m_Acceler.Length - 1;
        float t = 0;
        int i = 0;
        while (true)
        {
            t += Time.deltaTime;
            if (t >= deltaT)
            {
                i++;
                if (i > len)
                {
                    break;
                }
                t = 0;
                Vprev = Vector2.zero;
            }
            Vprev = Vnext(Vprev, m_Acceler[i], m_Acceler[i], t);
            m_Dot.velocity = Vprev;
            yield return new WaitForEndOfFrame();
        }
        m_Dot.velocity = Vector3.zero;
        yield return null;
    }

    private Vector2 Vnext(Vector2 Vn, Vector2 Anext, Vector2 An, float t)
    {//v[n+1]= v[n]+0,5(a[n+1] +a[n]) * t
        var v = Vn + 0.5f * (Anext + An) * t;
        return v;
    }
}

关于c# - 使用Verlet方法在unity2d中绘制火鸡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57015396/

相关文章:

c# - toolStrip 有 menuStrip 渐变背景

c# - 访问属性

c# - 如果 POST 请求中的文件总大小超过 30MB,ASP.NET Core 将抛出 -4077 ECONNRESET

unity3d - 如何以某种方式移动角色?

c# - 如何使用 SIMPLE JSON 将 JSON 反序列化为列表?

javascript - 导出到 WebGL 以用于 React Native

c++ - 太阳系模拟项目(velocity verlet 帮助)

c# - 如何将 SOAP header 附加到我的 C# 客户端?