wenn partiikel in einander sind werden sie nun genau um den overlap versetzt und es gibt friction bei collisionen
This commit is contained in:
@@ -87,6 +87,7 @@ func physics(particleList *[MAXPOINTS]rl.Vector2, particleCount int, particleLis
|
||||
var gravity rl.Vector2 = rl.Vector2{0, 300}
|
||||
var newParticleList [MAXPOINTS]rl.Vector2
|
||||
var newParticleSpeed [MAXPOINTS]rl.Vector2
|
||||
var particleFriction float32 = 0.85
|
||||
|
||||
for j := float64(0); j < 50; {
|
||||
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
|
||||
for l := 0; l < particleCount; l++ {
|
||||
if rl.CheckCollisionCircles(currentPositions[i], *particleRadius, currentPositions[l], *particleRadius) && (l != i) {
|
||||
var colNormal rl.Vector2 = rl.Vector2Normalize(rl.Vector2Subtract(currentPositions[i], currentPositions[l]))
|
||||
particleSpeed[i] = rl.Vector2Reflect(particleSpeed[i], colNormal)
|
||||
currentPositions[i] = rl.Vector2Add(currentPositions[i], rl.Vector2Scale(rl.Vector2Normalize(particleSpeed[i]), *particleRadius/2))
|
||||
if l == i {
|
||||
continue
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user