Fahrzeug Fahrverhalten ohne AlignToVector

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

mpreu

Betreff: Fahrzeug Fahrverhalten ohne AlignToVector

BeitragMo, Dez 23, 2013 16:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 23, 2013 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 24, 2013 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 24, 2013 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Dez 25, 2013 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

(dh es hilft generell, da es nicht nur themenspezifisch ist und man sich als aussenstehender auch hilfen rausziehen kann Smile )

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

BeitragMi, Dez 25, 2013 13:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Dez 25, 2013 13:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
 

mpreu

BeitragMi, Dez 25, 2013 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 26, 2013 0:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 27, 2013 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 27, 2013 0:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 27, 2013 1:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Dez 27, 2013 2:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragFr, Dez 27, 2013 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group