Seite 4 von 4
Re: Circle Physic Engine Userlib
Verfasst: 13.05.2011 12:40
von DrShrek
oh... well?! hat geschrieben:Den Error bekomm ich auch. Hab bis jetzt nur absolut keine Ahnung warum, weil es für mich keinen Sinn macht. Also irgendwie liegt der Fehler in der GroupParticle() Procedure. Vielleicht stimmt was mit der Logik einfach nich... wär erfreut wenn ihr da helfen könntet.
zum Erklären:
Hier eine schnelle (nicht ideale) Lösung:
Vor jeden
If constraint()\p1\... ein
If constraint()\p1 setzen.
ein Beispiel:
Code: Alles auswählen
;Render Constraints
ForEach constraint()
If constraint()\p1\image=0 And constraint()\p2\image=0
FrontColor(RGB(255,0,100))
LineXY(constraint()\p1\p\x,constraint()\p1\p\y,constraint()\p2\p\x,constraint()\p2\p\y)
EndIf
Next
Nachher:
Code: Alles auswählen
;Render Constraints
ForEach constraint()
If constraint()\p1
If constraint()\p1\image=0 And constraint()\p2\image=0
FrontColor(RGB(255,0,100))
LineXY(constraint()\p1\p\x,constraint()\p1\p\y,constraint()\p2\p\x,constraint()\p2\p\y)
EndIf
EndIf
Next
Re: Circle Physic Engine Userlib
Verfasst: 13.05.2011 13:19
von oh... well?!
scheint zu funktionieren^^. Dann liegt der Fehler ja garnicht in der GroupParticle() Procedure.
Aber ich versteh nicht warum ein Constraint einen falschen Pointer bekommt. Voraldingen weil der Pointer nach erstellen des Constraints ja nichmehr geändert wird.
Ohne die Attract() Procedure is mir der Fehler bis jetzt noch nich passiert...
Bei Attract() werden Constraints zwischen berührenden Particeln erstellt um den schleimigen Effekt zu erzeugen. Die Constraints reißen (werden zerstört) je nach dem wie groß das attract-Attribut der jeweiligen Particlen ist.
Re: Circle Physic Engine Userlib
Verfasst: 13.05.2011 15:18
von DrShrek
oh... well?! hat geschrieben:scheint zu funktionieren^^. Dann liegt der Fehler ja garnicht in der GroupParticle() Procedure.
Aber ich versteh nicht warum ein Constraint einen falschen Pointer bekommt. Voraldingen weil der Pointer nach erstellen des Constraints ja nichmehr geändert wird.
Ohne die Attract() Procedure is mir der Fehler bis jetzt noch nich passiert...
Bei Attract() werden Constraints zwischen berührenden Particeln erstellt um den schleimigen Effekt zu erzeugen. Die Constraints reißen (werden zerstört) je nach dem wie groß das attract-Attribut der jeweiligen Particlen ist.
Da ist halt noch ein dicker fetter Pointer BUG drinnen.
Optimieren lässt sich auch noch einiges.
Satt DynamicListen nimm besser Maps
Re: Circle Physic Engine Userlib
Verfasst: 14.05.2011 13:13
von c4s
Ein Physik-Fehler:
1) Warten bis eine der "Ketten" eingefroren wurde
2) Äußerstes Element dieser Kette bewegen, ohne das eine Kollision stattfindet
3) Man sieht nun, dass der Rest der Kette weiterhin eingefroren bleibt, obwohl er sich bewegen sollte
Re: Circle Physic Engine Userlib
Verfasst: 15.05.2011 12:51
von oh... well?!
@c4s
Jab, is mir auch schon aufgefallen.
Das liegt daran, dass die Particel "aufgetaut" werden, wenn sich die alte Position eines der Particeln der Gruppe von der neuen Position des selben Particles unterscheidet. Wenn man aber im Testprogramm ein statisches Particel bewegt (m=0) verändert man die alte und neue Position gleichermaßen, also wird kein Unterschied festgestellt.
Man kann jedoch ganz einfach das Particel manuell auftauen indem man eine kleine Änderung in der controls() Procedure ("Testprogram list.pb") macht.
Code: Alles auswählen
If MouseButton(2) And *SelectedParticle<>#Null
vect(*SelectedParticle\p,MouseX(),MouseY())
If *SelectedParticle\m=0
vect(*SelectedParticle\oldp,*SelectedParticle\p\x,*SelectedParticle\p\y)
EndIf
Else
*SelectedParticle=PointToParticle(MouseX(),MouseY(),5)
EndIf
wird zu :
Code: Alles auswählen
If MouseButton(2) And *SelectedParticle<>#Null
vect(*SelectedParticle\p,MouseX(),MouseY())
If *SelectedParticle\m=0
vect(*SelectedParticle\oldp,*SelectedParticle\p\x,*SelectedParticle\p\y)
*SelectedParticle\freezed=0 ;<<----------------
EndIf
Else
*SelectedParticle=PointToParticle(MouseX(),MouseY(),5)
EndIf