Untitled
unknown
plain_text
2 years ago
2.1 kB
11
Indexable
void UpdateState(Vector3 lcenter, Vector3 rcenter, float dt, ref float[] particle_state)
{
//attraction force1 (c1-x)/(||c1-x||)
float dist = Mathf.Sqrt((rcenter.x - particle_state[0])*(rcenter.x - particle_state[0]) + (rcenter.y - particle_state[1])*(rcenter.y - particle_state[1]) + (rcenter.z - particle_state[2])*(rcenter.z - particle_state[2]));
//float dist = Mathf.Sqrt(Math.Pow((float)(rcenter.x-particle_state[0]), 2.0f) + Mathf.Pow((float)(rcenter.y-particle_state[1]), 2.0f) + Mathf.Pow((float)(rcenter.z-particle_state[2]), 2.0f));
Vector3 force1 = new Vector3(((rcenter.x-particle_state[0])/dist), ((rcenter.y-particle_state[1])/dist), ((rcenter.z-particle_state[2])/dist));
//attraction force2
float dist2 = Mathf.Sqrt((lcenter.x - particle_state[0])*(lcenter.x - particle_state[0]) + (lcenter.y - particle_state[1])*(lcenter.y - particle_state[1]) + (lcenter.z - particle_state[2])*(lcenter.z - particle_state[2]));
//float dist2 = Mathf.Sqrt(Math.Pow((lcenter.x-particle_state[0]), 2.0f) + Mathf.Pow((lcenter.y-particle_state[1]), 2.0f) + Mathf.Pow((lcenter.z-particle_state[2]), 2.0f));
Vector3 force2 = new Vector3(((lcenter.x-particle_state[0])/dist2), ((lcenter.y-particle_state[1])/dist2), ((lcenter.z-particle_state[2])/dist2));
//linear drag function
Vector3 drag = -0.012f*new Vector3(particle_state[3], particle_state[4], particle_state[5]);
string name = transform.gameObject.name;
Vector3 allforce = force1 + force2;
if (name.Contains("bad")){
}else{
allforce += drag;
}
allforce /= mass;
//so all force is now the derivative of v, to get v, must integrate allforce (v') this is part c
//we can use forward euler's
particle_state[3] += allforce.x * dt;
particle_state[4] += allforce.y * dt;
particle_state[5] += allforce.z * dt;
//part d
for (int d = 0; d < 3; d++){
particle_state[d] += particle_state[d+3] * dt;
}
}Editor is loading...
Leave a Comment