69 lines
1.6 KiB
C#
69 lines
1.6 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
[Serializable]
|
|
public class Spring2D
|
|
{
|
|
public int p1;
|
|
|
|
public int p2;
|
|
|
|
public float restLen;
|
|
|
|
public float ks;
|
|
|
|
public float kd;
|
|
|
|
public float len;
|
|
|
|
public Spring2D(int _p1, int _p2, float _ks, float _kd, MegaSoft2D mod)
|
|
{
|
|
p1 = _p1;
|
|
p2 = _p2;
|
|
ks = _ks;
|
|
kd = _kd;
|
|
restLen = Vector2.Distance(mod.masses[p1].pos, mod.masses[p2].pos);
|
|
len = restLen;
|
|
}
|
|
|
|
public void doCalculateSpringForce(MegaSoft2D mod)
|
|
{
|
|
Vector2 vector = mod.masses[p1].pos - mod.masses[p2].pos;
|
|
float magnitude = vector.magnitude;
|
|
float num = (magnitude - restLen) * ks;
|
|
Vector2 lhs = mod.masses[p1].vel - mod.masses[p2].vel;
|
|
float num2 = Vector2.Dot(lhs, vector) * kd / magnitude;
|
|
Vector2 vector2 = vector * (1f / magnitude);
|
|
vector2 *= 0f - (num + num2);
|
|
mod.masses[p1].force += vector2;
|
|
mod.masses[p2].force -= vector2;
|
|
}
|
|
|
|
public void doCalculateSpringForce1(MegaSoft2D mod)
|
|
{
|
|
Vector2 vector = mod.masses[p1].pos - mod.masses[p2].pos;
|
|
if (vector != Vector2.zero)
|
|
{
|
|
float magnitude = vector.magnitude;
|
|
vector = vector.normalized;
|
|
Vector2 vector2 = (0f - ks) * ((magnitude - restLen) * vector);
|
|
mod.masses[p1].force += vector2;
|
|
mod.masses[p2].force -= vector2;
|
|
len = magnitude;
|
|
}
|
|
}
|
|
|
|
public void doCalculateSpringForce2(MegaSoft2D mod)
|
|
{
|
|
Vector2 vector = mod.masses[p1].pos - mod.masses[p2].pos;
|
|
float magnitude = vector.magnitude;
|
|
float num = (magnitude - restLen) * ks;
|
|
float num2 = magnitude - len;
|
|
float num3 = num2 * kd / magnitude;
|
|
Vector2 vector2 = vector * (1f / magnitude);
|
|
vector2 *= 0f - (num + num3);
|
|
mod.masses[p1].force += vector2;
|
|
mod.masses[p2].force -= vector2;
|
|
}
|
|
}
|