我们正在使用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);
}
}
答案 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];
}
}