Fahrzeug Fahrverhalten ohne AlignToVector
Übersicht

mpreuBetreff: Fahrzeug Fahrverhalten ohne AlignToVector |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
zu Beginn: allen eine besinnliche Weihnachtszeit
desweiteren: ich habe hier: https://www.blitzforum.de/foru...hp?t=39846 schonmal die Frage gestellt, da es sich nicht direkt um bb3d Programmierung handelt. Da sich bisher dort niemand gemeldet hat, dachte ich ich frage einfach mal hier, vielleicht liest es dann eher einer.(ein mod kann dann gerne den anderen Thread löschen) Also im Grunde suche ich eine Möglichkeit ein Fahrzeugchassis so zu bewegen das es recht natürlich aussieht. Wie das driver beispiel von bb3d nur eben ohne aligntovector. Also ich habe ein terrain und vier räder, wie richte ich nun am besten (und möglichst einfach erklärt) das chassis an deren Position aus. Vielleicht weiß ja hier jemand Rat. Vorhanden sind die Positionen der Räder und somit müsste sich doch irgendetwas errechnen lassen. Mir ist auch klar dass das nicht ganz einfach ist, da ich derzeit keine Federung o.ä. drin habe. Es wäre schön wenn mir jemand hilft. |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, wenn die Räder schon an der richtigen Position sind, und du nur noch den Rest vom Auto anpassen willst, das ist nicht so schwer.
Zuerst brauchst du Vektoren zwischen den Rädern. Nehmen wir zuerst mal drei Räder, und nehmen an, das vierte ist in einer Ebene mit den anderen, dann schaut das so aus (O ist ein Rad): Code: [AUSKLAPPEN] v1 (r1) O --> O (r2) | v2 | V (r3) O O (r4) Jeder der Pfeile steht dafür für einen Vektor, den du aufstellen musst. Ich nehme an, du weißt, was ein Vektor ist (ansonsten erkläre ich das nachher nochmal). Um die Vektoren zu kriegen musst du also nur noch folgendes machen: v1 = r2-r1 v2 = r3-r1 (also jeweils für die X-, Y- und Z-Koordinate von den Rädern) Jetzt brauchst du noch den Winkel, indem diese Räder zur "Welt" stehen. Dafür basteln wir uns noch drei Vektoren: Code: [AUSKLAPPEN] vX = (0 | v1.y| v1.z) vY = (v1.x| 0| v1.z) vZ = (v2.y|-v2.x| 0) (bei dem hier bin ich mir nicht ganz sicher, musst du ausprobieren) Dann musst du davon die Skalarprodukte nehmen, um auf die einzelnen Winkel zu kommen: Code: [AUSKLAPPEN] rotX = 0*0+vX.y*1+yX.z*1 = vX.y+vX.z rotY = vY.x*1+0*0+yY.z*1 = vY.x+vY.z rotZ = vZ.x*1+yZ.y*1+0*0 = vZ.x+vZ.y Man kann auch die letzten beiden Schritte zusammenfassen als Code: [AUSKLAPPEN] rotX = v1.y+v1.z rotY = v1.x+v1.z rotZ = v2.y-v2.x Damit hat man die Rotation zwischen drei der vier Räder. Will man das vierte noch berücksichtigen, dann wiederholt man das Ganze mit r2, r3 und r4 und nimmt den Durchschnitt aus beiden Ergebnissen. |
||
mpreu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vielen lieben Dank schonmal.
Im Groben hab ich das sogar verstanden, obwohl ich mich bisher nur mal kurz belesen habe was Vektorenrechnung betrifft. Und zum Thema Skalar werde ich Freund google mal anwerfen. Auf jeden Fall vielen Dank und ich hoffe ich schaffe das umzusetzen. Aber sooo schwer sieht das nicht aus. |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein Skalar ist quasi das Gegenteil eines Vektors, also nur eine einzelne Zahl.
Ein dreidimensionaler Vektor besteht ja aus drei Skalaren (also einzelnen Zahlen) Code: [AUSKLAPPEN] (2) v = (4) (7) oder v = (2|4|7) s = 5 (<= Skalar) Das Skalarprodukt kann man verwenden, um den Winkel zwischen zwei Vektoren zu berechen, und mir kommt gerade, dass ich da bei dem Post oben Mist gebaut habe, werde es gleich dann korrigieren. Es heißt Skalarprodukt, weil im Gegensatz zum Vektorprodukt ein Skalar als Ergebnis rauskommt. Das Skalarprodukt wird angeschrieben wie eine Multiplikation mit einem Punkt oder Stern, im Gegensatz zu dem Vektorprodukt, was als Multiplikation mit einem x angeschrieben wird: Code: [AUSKLAPPEN] Skalarprodukt: v1*v2
Vektorprodukt: v1 x v2 Das Skalarprodukt funktioniert so: Code: [AUSKLAPPEN] v1 = (1|2|3) v2 = (4|5|6) v1*v2 = v1.x*v2.x+v1.y*v2.y+v1.z*v2.z v1*v2 = 1*4+2*5+3*6 Das ist aber noch nicht der fertige Winkel, für den Winkel braucht man dann noch das hier: (alpha ist der Winkel zwischen v1 und v2; |v1| ist der Betrag von v1, also die Länge von v1) Code: [AUSKLAPPEN] v1*v2 = |v1|*|v2|*cos(alpha) cos(alpha) = (v1*v2)/(|v1|*|v2|) alpha = acos((v1*v2)/(|v1|*|v2|)) Der Betrag berechnet sich dabei wie folgt (nach Pythagoras): Code: [AUSKLAPPEN] |v1| = (v1.x^2 + v1.y^2 + v1.z^2)^.5 oder etwas flotter (da x^2 langsam ist und sich auch als x*x anschreiben lässt, was deutlich schneller ist): |v1| = (v1.x*v1.x + v1.y*v1.y + v1.z*v1.z)^.5 Um das von vorhin noch zu korrigieren muss man vX, vY und vZ normalisieren, also durch ihren Betrag dividieren, damit ihre Länge 1 wird. Code: [AUSKLAPPEN] vX = (0 | v1.y| v1.z) / (v1.y*v1.y+v1.z*v1.z)^.5
vY = (v1.x| 0| v1.z) / (v1.x*v1.x+v1.z*v1.z)^.5 vZ = (v2.y|-v2.x| 0) / (v1.x*v1.x+v1.y*v1.y)^.5 |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Heyho DAK!
Ich bin zwar grade garnicht im thema hier drinne, aber ich verfolge sehr intressiert deine erklärungen. Da auch ich eine ziemliche flasche bin was vektor rechnungen angeht, hilft es doch ungemein ![]() (dh es hilft generell, da es nicht nur themenspezifisch ist und man sich als aussenstehender auch hilfen rausziehen kann ![]() Eins verstehe ich grade nicht ganz: Warum verwendest du ^.5 und nicht Sqrt() ? Beides ist im prinzip das selbe.. ist ^.5 schneller als Sqrt oder lediglich eine andere schreibweise? |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe ^.5 verwendet, weil ich grad den Befehl Sqrt nicht im Kopf gehabt habe. Ich war etwas in Zeitdruck, wie ich das geschrieben habe. Hab gewusst, dass ^.5 auf jeden Fall geht, und war mir nicht sicher, ob es in BB Sqrt gibt, und wie man ihn genau schreibt (in manchen Sprachen ist es auch sqr). Sqrt wird auf jeden Fall gehen und wahrscheinlich schneller sein.
Hab grad noch mal nachgeschaut, in BB heißt der wirklich Sqr(). Sqr(x) = x^(1/2) = x^.5 Soll ich eventuell so wie das Hardware-Tutorial noch ein kleines Vektorrechnung-Tutorial machen? |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Davon haben wir hier zwar schon eine ganze menge (glaube ich),
Aber ich würde mich sehr freuen. Ich hatte mich mal an einem Deferred renderer versucht, aber zb nie das Skalarprodukt verstanden. Dieses brauchte ich aber um die normalen der flächen mit dem licht zu verrechnen.. war ein ganz schönes werteverschieben. Allerdings habe ich dann eine bitte: Die meisten erklärungen beziehen sich tatsächlich nur auf die theoretische erklärung, ohne praktische anwendung. Die ausrichtung eines Fahrzeugkörpers anhand der positionen der räder ist einleuchtender als eine aneinanderreihung von mathematischen funktionen^^ Oft weiß ich persönlich garnicht, wie ich ein gegebenes problem berechnen kann, obwohl es ziemlich simpel über Vektoren geht (und obwohl ich teile der materie kenne, weiß ich eben nicht das ich zb nur ne simple senkrechte aufstellen muss und aus irgendwas irgendwas anderes verrechnen muss xD) Kurzum: Wenn man weiß, wie man diverse probleme über vektoren lösen kann, dh weil man praxisbeispiele im hinterkopf hat und diese dann auf andere proebleme projezieren kann, dürfte das eine ganze menge mehr helfen als die pure theorie ![]() |
||
mpreu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
PhillipK, das unterschreibe ich so.
Manche Sachen sin d schwerer zu verstehen wenn man es sich nicht bildlich vorstellen kann. Bestes Beispiel ist meiner Meinung nach Matrizenberechnung...ganz böses Thema... Aber back2topic, klar über so ein Tutorial würde auch ich mich freuen. |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Matrizen sind wirklich böse, da hast du recht^^ Mächtig aber böse.
Dann werde ich mich mal daran machen und schauen, dass ich es mit praktischen Beispielen verknüpfe. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
mpreu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich habe nochmal eine frage am rande.
pointentity ist im grunde das gleiche wie aligntovector, oder? also bis auf die tatsache dass man dort einzelne achsen angibt. also wenn pointentity statt dem zielobjekt x,y,z als parameter hätte. korrekt? |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jein, ist ähnlich, aber nicht das Gleiche.
AlignToVector nimmt einen Vektor, der in eine Richtung zeigt (tun Vektoren ja) und dreht das Objekt so, dass es in die gleiche Richtung schaut, wie der Vektor. Die Position des Objektes ist dabei egal. PointEntity erstellt einen Vektor vom Objekt zu der Position des Zielobjekts und wendet dann AlignToVecor mit diesem Vektor an. Hierbei ist es nicht mehr egal, wo sich das Objekt befindet. z.B.: Objekt befindet sich an (0|0|0), Ziel befindet sich an (1|1|1). Der Richtungsvektor ist also (nach Spitze minus Schaft) (1|1|1) - (0|0|0) = (1|1|1) Befindet sich das Objekt aber an (3|4|5) und das Ziel wieder an (1|1|1), dann ist der Richtungsvektor also (1|1|1) - (3|4|5) = (-2|-3|-4) Das Objekt wird also in eine ganz andere Richtung schauen. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Außerdem richtet PointEntity nur die Z-Achse auf das Zielobjekt. AglinToVector kann auch die X oder Y Achse ausrichten. Aber dafür hat PointEntity noch den dritten Parameter mit dem um die Z-Achse gedreht werden kann. | ||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Kruemelator:
Das stimmt so nicht. Online-Hilfe hat Folgendes geschrieben: Die Anweisung PointEntity dreht ein Quell-Objekt so, dass es danach direkt auf ein Ziel-Objekt zeigt. Bei der Drehung werden nur die Pitch- und Yaw-Winkel geändert. Roll-Winkel wird nicht geändert. Deshalb gibt es noch den optionalen Parameter "Roll".
Das heißt, PointEntity dreht X-(=Pitch) und Y-(=Yaw)Winkel, nicht aber den Z-(=Roll)Winkel. der dritte Parameter wird verwendet, um den Z-Winkel manuell zu setzen. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
mpreu |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich meinte nur damit, dass es von der Grundart her wie die Ausrichtung berechnet wird diegleiche ist, oder?
Mir geht es darum dass es in einer Engine den Befehl LookAt(Entity, x, y, z) gibt und nun wäre es wichtig zu wissen ob es bis auf den achsenparameter(und tempo, was unwichtig ist) auf das selbe hinauskommt. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group