brainlag: abpralllwinkel?
-
TGGC schrieb:
Warum macht ihr alle so eine komplizierte Sache daraus? Einfach einen Vektor vom Kollisionspunkt zum Mittelpunkt des Balles bilden, diesen normieren, den aktuellen Translations Vektor auf diesen Vektor projezieren und danach das doppellte des Resultats davon abziehen. Fertig! f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
danke für die kompetente antwort
leider hab ich noch nie von "translationsvektoren" gehört
sprich
"Translations Vektor auf diesen Vektor projezieren" versteh ned so ganz
bei wikipedia bin ich auch nicht fündig geworden, der einzige eintrag der translationsvektor enthält ist "oberflächenchemie" 
edit: achja, ganz vergessen: wie behandle ich denn dann das problem, dass immer mehrere pixel die wände berüren ?
edit2: achso translationsvektor = richtungsvektor(meines objektes)? kk dann versuch ich das mal
-
auf meine art, und dann die Mitte nehmen
-
super, habs durch intensives debuggen hinbekommen! (waren einige fehler drin)
das einzige was mich noch stört ist, das bei einem relativ flachen aufprall zu viel energie der alten bewegungsrichtung verloren geht und in die "abprallrichtung" übergeht (etwa so als wäre der ball aus gummi und hätte einen drall in die entgegengesetzte richtung)habt ihr vielleicht ne idee woran das liegen könnte? (falls ihr den quellcode sehen wollt, sagt bescheid)
vielen dank
-
pixartist schrieb:
danke für die kompetente antwort
leider hab ich noch nie von "translationsvektoren" gehört
sprich
"Translations Vektor auf diesen Vektor projezieren" versteh ned so ganzTranslation == Verschiebung bzw. Bewegung, Translationsvektor == "Bewegungsvektor", so wie du ihn schon im ersten Post erwaehnst.
Zur Projektion: http://de.wikipedia.org/wiki/Skalarprodukt#Grundlegende_Eigenschaften f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
achso natüüürlich
projektion...hätte man auch drauf kommen können. aber sry, dass ich NOCHMAL nachfrage, ich hab jetzt die projektionslänge, aber wovon soll ich die abziehen?
dachte eigentlich ich müsste den normierten vektor vom kollisionspunkt zum mittelpunkt mit der projektionslänge multiplizieren (*2) und dann vom translationsvektor abziehen, das resultiert aber nicht grade im korrekten verhalten
double tx = ball.dir.x*ball.len; //translationsvektor des balles double ty = ball.dir.y*ball.len; //translationsvektor des balles double projektion = apv.x*tx + apv.y*ty; //projektion auf den vektor vom kollisionspunkt(apv) apv.x *= projektion*2; //is klar (apv ist normiert) apv.y *= projektion*2; tx -= apv.x; //abziehen vom translationsvektor ty -= apv.y; double tl = sqrt(tx*tx+ty*ty); tx /= tl; //normieren ty /= tl; ball.dir.x = tx; //an den ball übergeben ball.dir.y = ty;edit: hm wieso muss ich den ball 2 schritte zurückbewegen damit es funzt ?
dadurch bleibt er nie liegen sondern zittert immer so dumm rum
-
Doch, das resultiert in korrektem Verhalten. Damit wird das Einfalls == Ausfallswinkel Prinzip auf eine Spiegelung ueberfuehrt. Wenn eine Kugel kollidiert, so liegt die Ebene, an der gespiegelt wird, immer tangential an der Stelle, wo sich Kugel und Hinderniss beruehren. Diese Ebene kann daher durch den Vektor Kollisionspunkt->Mittelpunkt beschrieben werden, da dieser eine Normale der Ebene ist. Wenn du dir das mal aufmalst, sollte es recht schnell klar werden.
Weitere Fehler liegen also wo anders, z.b. ungenaue Kollisionserkennung. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
-
TGGC schrieb:
Doch, das resultiert in korrektem Verhalten. Damit wird das Einfalls == Ausfallswinkel Prinzip auf eine Spiegelung ueberfuehrt. Wenn eine Kugel kollidiert, so liegt die Ebene, an der gespiegelt wird, immer tangential an der Stelle, wo sich Kugel und Hinderniss beruehren. Diese Ebene kann daher durch den Vektor Kollisionspunkt->Mittelpunkt beschrieben werden, da dieser eine Normale der Ebene ist. Wenn du dir das mal aufmalst, sollte es recht schnell klar werden.
Weitere Fehler liegen also wo anders, z.b. ungenaue Kollisionserkennung. f'`8k
AutocogitoGruß, TGGC (making great games since 1992)
jau danke
nach gründlichem nachdenken hab ich jetzt auch alles verstanden 
hast du vielleicht ne idee, wie man erkennen kann ob ein ball liegt und ihn dann festhalten kann ? denn dadurch, dass immer die schwerkraft draufgerechnet wird, hüpft der ball immernoch ein kleines bisschen.
ich hab versucht, zu überprüfen, ob die länge des bewegungsvektors bei einer kollision einen bestimmten wert unterschreitet, das problem dabei ist aber, dass der ball ja auch z.B. beim "nach-oben-springen" eine oberfläche mit sehr geringer geschwindigkeit streifen kann und dann irrtümlicherweise festgehalten wirdedit: und toll wär auchnoch, wenn du mir nen tipp geben könntest, wie ich die "bounciness" und rutschigkeit eines objektes unabhängig voneinander verändern könnte

danke
-
Ruhelagen berechnen ist tatsaechlich nicht so ganz trivial, das kriegen auch die professionellen Physik Engines nie so richtig hin. Aber es wuerde sicher schonmal was bringen, wenn du testest, ob der Kollisionspunkt unten ist.
Aber was genau soll bounciness und Rutschigkeit sein? Definier das mal. f'`8k
Gruß, TGGC (making great games since 1992)
-
Hört sich nach nem Elastizitätsfaltor bzw. einem Reibungskoeffizient an. Schau dir mal die Geschichten hier an. Wird dir auf jeden Fall (früher oder später) eine Hilfe sein.
http://de.wikipedia.org/wiki/Drallsatz
http://de.wikipedia.org/wiki/Elastischer_Stoss
-
nunja, ich möchte unabhängig voneinander einstellen, wieviel energie beim aufprall in richtung des kollsionsvektors verloren geht, und wieviel energie parallel zur kollisionsoberfläche verloren geht.
-
pixartist schrieb:
nunja, ich möchte unabhängig voneinander einstellen, wieviel energie beim aufprall in richtung des kollsionsvektors verloren geht, und wieviel energie parallel zur kollisionsoberfläche verloren geht.
einfach konstatnte festlegen (bsp 0.8), und bei jedem Aufprall die x- als auch die y Geschwindigkeit damit multiplizieren, das ist ja jetzt nicht sonderlich schwer oder?
-
Krux schrieb:
pixartist schrieb:
nunja, ich möchte unabhängig voneinander einstellen, wieviel energie beim aufprall in richtung des kollsionsvektors verloren geht, und wieviel energie parallel zur kollisionsoberfläche verloren geht.
einfach konstatnte festlegen (bsp 0.8), und bei jedem Aufprall die x- als auch die y Geschwindigkeit damit multiplizieren, das ist ja jetzt nicht sonderlich schwer oder?
dein vorschlag funktioniert aber nur, wenn es keine schrägen flächen gibt...
-
pixartist schrieb:
Krux schrieb:
pixartist schrieb:
nunja, ich möchte unabhängig voneinander einstellen, wieviel energie beim aufprall in richtung des kollsionsvektors verloren geht, und wieviel energie parallel zur kollisionsoberfläche verloren geht.
einfach konstatnte festlegen (bsp 0.8), und bei jedem Aufprall die x- als auch die y Geschwindigkeit damit multiplizieren, das ist ja jetzt nicht sonderlich schwer oder?
dein vorschlag funktioniert aber nur, wenn es keine schrägen flächen gibt...
wenn du bereits die neue Richtung deiner Bewegung ausgerechnet hast, dann kannst du doch genau wie sonst auch die neue x- und y-Geschwindigkeit mit dem konstanten Faktor multiplizieren. Ist genau so schwer.
-
nein sry, du hast das wohl falsch verstanden, wenn die oberfläche, an der der ball ortogonal abprallt, z.b einen winkel von 45 grad hat, dann kann ich nicht einfach sagen, x*0.8 und y*0.2, dann springt der ball ja nicht mit 20% der energie zurück

-
also hier will ich den paralellen und ortogonalen vektor(bzw die länge) zum aufprallvektor ausrechnen, die beiden dann unabhängig von einander verkürzen und dann wieder zum bewegungsvektor zusammenfügen:
double para = apv.x*tx + apv.y*ty; double orto = apv.y*tx + (apv.x*-1)*ty; para *= 0.9; orto *= 0.3; DblPoint parav; parav.x = para*apv.x; parav.y = para*apv.y; DblPoint ortov; ortov.x = orto*apv.y; ortov.y = orto*(apv.x*-1); DblPoint newV; newV.x = parav.x + ortov.x; newV.y = parav.y + ortov.y; double vlen = sqrt(newV.x*newV.x + newV.y*newV.y); ball.dir.x = newV.x/vlen; ball.dir.y = newV.y/vlen; ball.len = vlen; cx += ball.dir.x; cy += ball.dir.y;irgendwie klappts aber ned so

EDIT:
Habs!
apv.x /= 2; apv.y /= 2; double tx = ball.dir.x*ball.len; double ty = ball.dir.y*ball.len; double projektion = apv.x*tx + apv.y*ty; ball.pos.x -= apv.x; ball.pos.y -= apv.y; tx -= apv.x*(projektion*2); ty -= apv.y*(projektion*2); double para = apv.x*tx + apv.y*ty; double orto = apv.y*tx + (apv.x*-1)*ty; para *= 0.3; orto *= 0.9; DblPoint parav; parav.x = para*apv.x; parav.y = para*apv.y; DblPoint ortov; ortov.x = orto*apv.y; ortov.y = orto*(apv.x*-1); DblPoint newV; newV.x = parav.x + ortov.x; newV.y = parav.y + ortov.y; double vlen = sqrt(newV.x*newV.x + newV.y*newV.y); ball.dir.x = newV.x/vlen; ball.dir.y = newV.y/vlen; ball.len = vlen; cx += ball.dir.x; cy += ball.dir.y;danke nochmal, hab in diesem thread einiges gelernt
