automatically find starting points of cables

This commit is contained in:
Felix Klenner 2023-12-01 18:18:34 +01:00
parent 0f4911a96e
commit cd25f31a77
3 changed files with 17 additions and 13 deletions

View file

@ -5,13 +5,13 @@ using static System.Math;
/** Cable Joints algorithm based on Paper by Matthias Müller, Nuttapong Chentanez, Stefan Jeschke and Miles Macklin*/
public static class CableJointsAlgorithm {
public static void TimeStep(List<Cable> cables) {
public static void TimeStep(List<GameObject> cableStartingPoints) {
//handle each cable individually
foreach (var cable in cables) {
foreach (var cable in cableStartingPoints) {
float totalDist = 0;
//calculate new attachment points for all joints
for (var go = cable.firstRoller; go != null; go = go.GetComponent<RollerProperties>().linkTo) {
for (var go = cable; go != null; go = go.GetComponent<RollerProperties>().linkTo) {
if (go.GetComponent<RollerProperties>().linkTo != null) {
var dist = go.GetComponent<DistanceJoint2D>();
var rp = go.GetComponent<RollerProperties>();

View file

@ -3,7 +3,7 @@ using TMPro;
using UnityEngine;
public class Controller : MonoBehaviour {
private List<Cable> cables = new();
private List<GameObject> cableStartingPoints = new();
//Initialize
void Awake() {
@ -36,7 +36,13 @@ public class Controller : MonoBehaviour {
//collisions and physics
Rigidbody2D rb = go.GetOrAddComponent<Rigidbody2D>();
rb.useAutoMass = true; // mass is based on size
// mass is based on area, if not provided
if (rp.mass == null) {
rb.useAutoMass = rp.mass == null;
}
else {
rb.mass = rp.mass.Value;
}
rb.angularDrag = 1;
rb.drag = 1;
if (rp.movement == RollerProperties.RotationType.Fixed) {
@ -45,8 +51,10 @@ public class Controller : MonoBehaviour {
go.AddComponent<PolygonCollider2D>();
if (rp.start) {
cables.Add(new Cable { firstRoller = go });
//build list of cable starting objects
cableStartingPoints.Add(go);
if (rp.linkTo != null) {
cableStartingPoints.Remove(rp.linkTo);
}
Debug.Log("Initialized roller: " + go.name);
@ -129,12 +137,8 @@ public class Controller : MonoBehaviour {
}
if (waitedFrames++ > -1) {
CableJointsAlgorithm.TimeStep(cables);
CableJointsAlgorithm.TimeStep(cableStartingPoints);
waitedFrames = 0;
}
}
}
public class Cable {
public GameObject firstRoller;
}

View file

@ -5,12 +5,12 @@ using UnityEngine.Serialization;
[System.Serializable]
public class RollerProperties : MonoBehaviour {
//settings
[SerializeField] public bool start = false;
[SerializeField] public bool clockwise = false;
[SerializeField] public GameObject linkTo = null;
[SerializeField] public RotationType movement = RotationType.Fixed;
[FormerlySerializedAs("fixedAttachmentPoint")] [SerializeField] public bool useFixedAttachmentPoint = false;
[SerializeField] public Vector2 attachmentPoint = new Vector2(0, 0);
[SerializeField] public float? mass = null;
//references
protected internal GameObject text;