private void StickToPlayers() { VertletSegment firstSegment = vertletSegments[0]; firstSegment.curPosition = PlayerController.player1.transform.position + ropePlayerOffset; this.vertletSegments[0] = firstSegment; //Constrant to Second Point VertletSegment endSegment = this.vertletSegments[vertletSegments.Count - 1]; endSegment.curPosition = PlayerController.player2.transform.position + ropePlayerOffset; this.vertletSegments[vertletSegments.Count - 1] = endSegment; for (int i = 0; i < this.numSegments - 1; i++) { VertletSegment firstSeg = this.vertletSegments[i]; VertletSegment secondSeg = this.vertletSegments[i + 1]; float dist = (firstSeg.curPosition - secondSeg.curPosition).magnitude; float error = Mathf.Abs(dist - this.ropeSegmentLength); Vector2 changeDir = Vector2.zero; if (dist > ropeSegmentLength) { changeDir = (firstSeg.curPosition - secondSeg.curPosition).normalized; } else if (dist < ropeSegmentLength) { changeDir = (secondSeg.curPosition - firstSeg.curPosition).normalized; } Vector2 changeAmount = changeDir * error; if (i != 0) { firstSeg.curPosition -= changeAmount * 0.5f; vertletSegments[i] = firstSeg; secondSeg.curPosition += changeAmount * 0.5f; vertletSegments[i + 1] = secondSeg; } else { secondSeg.curPosition += changeAmount; vertletSegments[i + 1] = secondSeg; } } }
private void SimulatePhysics() { Vector2 gravity = Vector2.down; for (int i = 1; i < this.numSegments; i++) { VertletSegment firstSegment = this.vertletSegments[i]; Vector2 velocity = firstSegment.curPosition - firstSegment.posOld; firstSegment.posOld = firstSegment.curPosition; firstSegment.curPosition += velocity; firstSegment.curPosition += gravity * Time.fixedDeltaTime; this.vertletSegments[i] = firstSegment; } //CONSTRAINTS for (int i = 0; i < 50; i++) { this.StickToPlayers(); } }