Sagen wir ich hab einen Character der in richtung 1|0|0 guckt, also entlang der x-Achse (wenn er un-rotiert ist).
Jetzt möchte ich den character in eine richtung laufen lassen. Dafür habe ich einen richtungsvektor erstellt und verschiebe den character nun anhand dessen
N = Richtungsvektor
T = Character Position
T = T + N * 5.0;
das klappt ja auch, nur möchte ich jetzt gern, das der character auch in die richtung schaut wo er hinläuft, also ich müßte ihn anhand des richtungsvektors ausrichten.
Sein FrontVektor ist 1|0|0, UpVector 0|1|0
Und, ganz wichtig.. ich brauche das ergebnis als Euler-Rotation.. also als wenn ich via glRotate erst um X, dann um Y und dann um Z rotiere um ihn auszurichten, einfach eine matrix multiplizieren oder so geht nicht.
okay... folgendes. mit 2 winkeln wirst du auch nur 2 eulerwinkel herausbekommen, weil du nicht weist, wie du den kerl um seine blickrichtungsachse drehen sollst. jedenfalls. der trick den ich mir überlegt hab, besteht im wesentlichen darin, geschickt zu projezieren.
aber bauen wir die sache mal langsam auf: du hast die momentane richtung l und möchtest sie auf die richtung v drehen. (siehe bild: rot). um an den winkel zu kommen, um den wir in y-Euler drehen wollen, projezieren wir die sache am besten auf die xz-Ebene (grün), d.h. wir basteln uns aus l und v neue winkel l_y und v_y, indem wir die y koordinate auf 0 setzen. ist einer der beiden winkel schrecklich kurz (länge kleiner als ein festgelegtes epsilon), dann setzen wir den y-winkel auf 0, ansonsten müssen wir ein wenig basteln:
Das Punktprodukt l_y*v_y geteilt durch die längen von l_y und v_y liefert uns den cosinus des gesuchten winkels e_y. Durch ziehen des arcos des cosinus bekommen wir e_y' - welcher leider noch nicht ganz das ist, was wir haben wollen, weil er immer den spitzeren der möglichen winkel wählt. wir haben also die möglichkeiten für e_y: e_y' und 2Pi-e_y'.
Wie wissen wir, welche von beiden Möglichkeiten nun richtig ist? Am besten berechen wir eine normale n_l_y zu l_y, indem wir x und z koordinaten vertauschen und eine davon mit -1 multiplizierst (aber bitte immer eine vorher definierte koordinate, z.B. immer die x-koordinate). nun berechnen wir n_l_y * v_y . Ist dieses Produkt positiv, dann bekommen wir e_y', sonst 2Pi-e_y' (es kann auch genau umgekehrt sein, abhängig davon, welche koordinate du mit -1 multipliziert hast. will mir da jetzt keine gedanken zu machen. probiers am besten aus. siehst du schon. wenns verkehrt ist, dreht er sich immer grad vom ziel weg ). Jedenfalls bist du so an deine erste Euler koordinate gekommen.
Das gleiche machste jetzt noch einmal , z.B. kannste die z-Euler koordinate bekommen, indem Du auf die yx-Ebene projezierst (z koordinate 0 setzen) und genau das spielchen für die richtungen v_z und l_z wiederholst. Dann haste deine 2 Eulerwinkel - den dritten darfste dann 0 setzen, falls du 3 Winkel haben möchtest ).
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
merke: mache niemals mathematik, wenn Du dich nebenbei mit englischer literatur, im besonderen über die entwicklung des US-englischen, beschäftigst. Die Sache die ich da beschreibe ist etwas faul. Sie klappt nur, wenn l eine koordinatensystemrichtung ist und man nicht ein zweites mal projeziert, sondern stattdessen den winkel zwischen l_y und v berechnet. Siehe auch das Kamera Tutorial 1 - Funktion LockTarget - da passiert das, nur werden die Winkel nie explizit berechnet, sondern gleich in matrizen verwurstet
will man allgemein an die eulerwinkel zum verdrehen, so rechnet man am besten die beiden vektoren in Kugelkoordinaten um und betrachtet den Winkelunterschied. Voilá. Ist aber ne Runde langsamer, als wenn man obiges macht.
Wenns besonders schnell gehen soll, aber Euler-Winkel völlig uninteressant sind - diese Ungetümer kann man eh nur selten brauchen und sie sorgen für reichlich verwirrung beim nachdenken und haben auch noch singularitäten - dann ist es vielleicht interessant einfach das kreuzprodukt aus v und l zu berechnen. Das nimmt man als Rotationsachse. Dann rechnet man noch den drehwinkel aus, was einfach der arccos aus dem punktprodukt durch die längen ist, weil das kreuzprodukt immer ein rechtssystem erzeugt (den 2Pi spass spart man sich also), dann kann man damit direkt glRotate versorgen oder bei Bedarf ein Quaternion daraus basteln.
will man allgemein an die eulerwinkel zum verdrehen, so rechnet man am besten die beiden vektoren in Kugelkoordinaten um und betrachtet den Winkelunterschied. Voilá. Ist aber ne Runde langsamer, als wenn man obiges macht.
Geschwindigkeit ist nebensächlich.. brauch die Euler Winkel Aber wie komm ich denn jetzt aus den 2 Kugelkoordinaten zu den Eulerwinkeln? :/
also ich werd daraus nicht schlau... ich hab jetzt einfach die 2 Kugelkoordinaten voneinander abgezogen und so zwei winkel bekommen... an und für sich stimmen die auch - meistens.
Immer wenn der Character auf einer der 3 Achsen läuft klappt es und er schaut in die richtige richtung..
Und das ist total falsch... der einzige unterschied zu davor ist, das die vektoren sehr kleine werte haben.. aber das ergebnis ist komplett verschieden..
Wieso...?
Aya~
PS: Es scheint immer nur dann zu passieren, wenn ich für Y und X gleichzeitig sehr kleine werte habe, bei allen anderen kombinationen scheint es zu funktionieren
Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.