Files
2026-02-21 16:45:37 +08:00

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;
}
}