wenn partiikel in einander sind werden sie nun genau um den overlap versetzt und es gibt friction bei collisionen

This commit is contained in:
any
2026-05-10 22:53:57 +02:00
parent d7bdbb698d
commit 9153ff23ef
+17 -4
View File
@@ -87,6 +87,7 @@ func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleLis
var gravity rl.Vector2 = rl.Vector2{0, 300} var gravity rl.Vector2 = rl.Vector2{0, 300}
var newParticleList [MAXPOINTS]rl.Vector2 var newParticleList [MAXPOINTS]rl.Vector2
var newParticleSpeed [MAXPOINTS]rl.Vector2 var newParticleSpeed [MAXPOINTS]rl.Vector2
var particleFriction float32 = 0.85
for j := float64(0); j < 50; { for j := float64(0); j < 50; {
var startTime time.Time = time.Now() var startTime time.Time = time.Now()
@@ -105,10 +106,22 @@ func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleLis
// Jede Goroutine arbeitet nur auf Index i → kein Datenkonflikt // Jede Goroutine arbeitet nur auf Index i → kein Datenkonflikt
for l := 0; l < particleCount; l++ { for l := 0; l < particleCount; l++ {
if rl.CheckCollisionCircles(currentPositions[i], *particleRadius, currentPositions[l], *particleRadius) && (l != i) { if l == i {
var colNormal rl.Vector2 = rl.Vector2Normalize(rl.Vector2Subtract(currentPositions[i], currentPositions[l])) continue
particleSpeed[i] = rl.Vector2Reflect(particleSpeed[i], colNormal) }
currentPositions[i] = rl.Vector2Add(currentPositions[i], rl.Vector2Scale(rl.Vector2Normalize(particleSpeed[i]), *particleRadius/2))
diff := rl.Vector2Subtract(currentPositions[i], currentPositions[l])
dist := rl.Vector2Length(diff)
minDist := *particleRadius * 2
if dist < minDist && dist > 0 {
colNormal := rl.Vector2Scale(diff, 1/dist) //durch länge des Vektoren teilen
// Exakt die Hälfte der Überlappung korrigieren
overlap := minDist - dist
currentPositions[i] = rl.Vector2Add(currentPositions[i], rl.Vector2Scale(colNormal, overlap*0.5))
particleSpeed[i] = rl.Vector2Scale(rl.Vector2Reflect(particleSpeed[i], colNormal), particleFriction)
} }
} }