我们如何在update()方法中一致地更新对象的位置?

时间:2019-07-16 23:48:25

标签: unity3d

我们正在使用Verlet方法移动Tukey。但是它只移动一次,而不是连续移动。更新Turkey位置的代码在Update()方法中,因此它应在每一帧中都起作用。但是它只运行了一次。

更进一步,我们在update方法中放置了三倍的代码来更新“土耳其线”渲染对象的位置,似乎土耳其的新位置只会移动一次,就好像我们移动了一次一样。

       using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GenerateTurkeys : MonoBehaviour
{

    public LineRenderer lineRenderer;
    // Start is called before the first frame update
    //int numberOfTurkeys;
    static int NUM_PARTICLES = 26;
    float fTimeStep;
    Vector3[] m_position = new Vector3[NUM_PARTICLES];
    Vector3[] m_acceleration = new Vector3[NUM_PARTICLES];
    Vector3[] m_oldPosition = new Vector3[NUM_PARTICLES];
    Vector3[] m_newPosition = new Vector3[NUM_PARTICLES];



    void Start()
    {
        lineRenderer = gameObject.GetComponent<LineRenderer>();

        lineRenderer.GetPositions(m_position);

        for(int i = 0; i < m_acceleration.Length; i++)
        {
            m_acceleration[i] = new Vector3(0.0f, -9.8f, 0.0f);
        }

        fTimeStep = 5.5f;


    }

    // Verlet integration step void ParticleSystem::
    void Verlet()
    {
        var random_direction = Random.Range(-1, 1);


            for (int i = 0; i < NUM_PARTICLES; i++)
            {
                m_newPosition[i] = 2 * m_position[i] - m_oldPosition[i] + m_acceleration[i] * fTimeStep * fTimeStep;
                m_oldPosition[i] = m_position[i];
                                }





    }



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


        Verlet();
        lineRenderer.SetPositions(m_newPosition);

          }
}

1 个答案:

答案 0 :(得分:3)

首先,FixedUpdate由物理引擎使用,并且与常规的Update方法不同。除非必须将要执行的操作与物理引擎同步,否则应使用Update

第二,您的m_position向量永远不会更新,您只能在lineRenderer.getPositions方法中调用Start。因此,您的m_oldPositions将始终相同,并且位置不会改变。为了解决这个问题,您的Verlet方法还应该在计算出新位置后更新m_position向量。 像这样:

    void Verlet()
    {
        var random_direction = Random.Range(-1, 1);


            for (int i = 0; i < NUM_PARTICLES; i++)
            {
                m_newPosition[i] = 2 * m_position[i] - m_oldPosition[i] + m_acceleration[i] * fTimeStep * fTimeStep;
                m_oldPosition[i] = m_position[i];
                m_position[i] = m_newPosition[i];
            }
}