Rotationswinkel im 3D raum

Habe folgendes vektorbezogene Problem bei der Programmierung einer 3D Anwendung:
Ich muß eine Fläche (Polygon) welche beliebig gedreht ist, wieder „flach auf den boden“ drehen (also normalenvektor parallel zur vertikalen Y-achse). Hierzu kann ich nur um XYZ-achse drehen, also nicht die Punkte des Polys einzeln manipulieren.
Per Vektorrechnung kann ich den Winkel des Normalenvektors zu den XYZ-Achsen rausfinden, und danach fangen die Probleme an:

  1. Ich bekomme auf dem Weg natürlich nur positive Werte zwischen 0 und 180°, weiß aber nicht in welchem Quadranten bzw welcher Richtung das Poly rotiert ist.
  2. Wenn das Poly „insich“ mehrfach verdreht ist (also um X, Y und Z gedreht, danach nochmal…), sagen die Winkel zu den Achsen scheinbar garnichts mehr aus.
  3. Wenn ich „vernünftige“ Werte rausbekomme, weiß ich immernoch nicht, an welcher Achse ich anfangen muß, zurück zu drehen, so komisch das klingt, davon hängt ab, ob es nachher gerade ist oder noch schiefer.

    Kennt jemand das Problem, oder noch besser, eine Lösung?

Gruß, Occide

Hallo

Per Vektorrechnung kann ich den Winkel des Normalenvektors zu
den XYZ-Achsen rausfinden, und danach fangen die Probleme an:

  1. Ich bekomme auf dem Weg natürlich nur positive Werte
    zwischen 0 und 180°, weiß aber nicht in welchem Quadranten bzw
    welcher Richtung das Poly rotiert ist.
  2. Wenn das Poly „insich“ mehrfach verdreht ist (also um X, Y
    und Z gedreht, danach nochmal…), sagen die Winkel zu den
    Achsen scheinbar garnichts mehr aus.
  3. Wenn ich „vernünftige“ Werte rausbekomme, weiß ich
    immernoch nicht, an welcher Achse ich anfangen muß, zurück zu
    drehen, so komisch das klingt, davon hängt ab, ob es nachher
    gerade ist oder noch schiefer.

Ich verstehe Dein Problem nicht. Gibt es denn bei diesem
Polygon ein „oben/unten“? Was hast Du denn am Anfang -
die 3 Koordinaten A,B,C mit je (x,y,z)?

Das Kreuzprodukt VECTOR(AB) x VECTOR(BC) liefert
Dir einen Vektor, der „nach oben“ oder „nach unten“
bezügich des Koordinatensystems zeigt. Die Punktprodukte
dieses Vektors zu den Koordinatenachsen liefern Dir dann
die Drehwinkel zu diesen.

Erklär bessernoch mal genauer :wink:

Grüße

CMБ

Hallo

Per Vektorrechnung kann ich den Winkel des Normalenvektors zu
den XYZ-Achsen rausfinden, und danach fangen die Probleme an:

  1. Ich bekomme auf dem Weg natürlich nur positive Werte
    zwischen 0 und 180°, weiß aber nicht in welchem Quadranten bzw
    welcher Richtung das Poly rotiert ist.
  2. Wenn das Poly „insich“ mehrfach verdreht ist (also um X, Y
    und Z gedreht, danach nochmal…), sagen die Winkel zu den
    Achsen scheinbar garnichts mehr aus.
  3. Wenn ich „vernünftige“ Werte rausbekomme, weiß ich
    immernoch nicht, an welcher Achse ich anfangen muß, zurück zu
    drehen, so komisch das klingt, davon hängt ab, ob es nachher
    gerade ist oder noch schiefer.

Ich verstehe Dein Problem nicht. Gibt es denn bei diesem
Polygon ein „oben/unten“? Was hast Du denn am Anfang -
die 3 Koordinaten A,B,C mit je (x,y,z)?

Das Kreuzprodukt VECTOR(AB) x VECTOR(BC) liefert
Dir einen Vektor, der „nach oben“ oder „nach unten“
bezügich des Koordinatensystems zeigt. Die Punktprodukte
dieses Vektors zu den Koordinatenachsen liefern Dir dann
die Drehwinkel zu diesen.

Erklär bessernoch mal genauer :wink:

Bin genau den von dir beschriebenen weg gegangen…

  1. Jep die polygone sind einseitig. zu anfang habe ich 3 punkte mit (x/y/z) des polygons.
  2. wenn ich das polygon nur um 30° um die x-achse drehe und danach den winkel abfrage, kommt korrekterweise 30° raus, wenn ich es aber um -30° drehe, kommt auch 30° heraus, wenn ichs um 210° drehe, genauso…
  3. wenn ich zb. das polygon um -30° um x, danach 30° um y und zuletzt wieder -30° um z drehe, und dieses danach wieder gerade machen will, dann also 30° um x zurückdrehn, -30° um y und 30° um z, ist es hinterher nicht gerade, wie man annimmt, sondern viel mehr verdreht, weil ich in der falschen reihenfolge gedreht hab… schwer zu erklären und nachzuvollziehen, am besten in ner 3D software ausprobieren, dann merkt man das problem… das ist so ähnlich wie mit dem rubikswürfel, ich weiß vorher nicht an welcher seite ich zuerst drehen muß (mal abgesehn von den anderen problemen)
    hoffe jetzt ist es klarer… HILFE!!! :frowning:

Hallo

  1. Jep die polygone sind einseitig. zu anfang habe ich 3
    punkte mit (x/y/z) des polygons.
  2. wenn ich das polygon nur um 30° um die x-achse drehe und
    danach den winkel abfrage, kommt korrekterweise 30° raus, wenn
    ich es aber um -30° drehe, kommt auch 30° heraus, wenn ichs um
    210° drehe, genauso…
  3. wenn ich zb. das polygon um -30° um x, danach 30° um y und
    zuletzt wieder -30° um z drehe, und dieses danach wieder
    gerade machen will, dann also 30° um x zurückdrehn, -30° um y
    und 30° um z, ist es hinterher nicht gerade, wie man annimmt,
    sondern viel mehr verdreht, weil ich in der falschen
    reihenfolge gedreht hab… schwer zu erklären und
    nachzuvollziehen, am besten in ner 3D software ausprobieren,
    dann merkt man das problem… das ist so ähnlich wie mit dem
    rubikswürfel, ich weiß vorher nicht an welcher seite ich
    zuerst drehen muß (mal abgesehn von den anderen problemen)
    hoffe jetzt ist es klarer… HILFE!!! :frowning:

OK, gib doch mal einen Satz von konkreten Beispielkoordinaten
hier an, und zwar so, wie Du sie programmiert hast. Dann
kann man auch gleich die Programmiersprache erkennen :wink:

Ich denke, man muß nur die sog. „Eulerwinkel“ ausrechnen
und das sollte es gewesen sein.

Grüße

CMБ

Hallo

  1. Jep die polygone sind einseitig. zu anfang habe ich 3
    punkte mit (x/y/z) des polygons.
  2. wenn ich das polygon nur um 30° um die x-achse drehe und
    danach den winkel abfrage, kommt korrekterweise 30° raus, wenn
    ich es aber um -30° drehe, kommt auch 30° heraus, wenn ichs um
    210° drehe, genauso…
  3. wenn ich zb. das polygon um -30° um x, danach 30° um y und
    zuletzt wieder -30° um z drehe, und dieses danach wieder
    gerade machen will, dann also 30° um x zurückdrehn, -30° um y
    und 30° um z, ist es hinterher nicht gerade, wie man annimmt,
    sondern viel mehr verdreht, weil ich in der falschen
    reihenfolge gedreht hab… schwer zu erklären und
    nachzuvollziehen, am besten in ner 3D software ausprobieren,
    dann merkt man das problem… das ist so ähnlich wie mit dem
    rubikswürfel, ich weiß vorher nicht an welcher seite ich
    zuerst drehen muß (mal abgesehn von den anderen problemen)
    hoffe jetzt ist es klarer… HILFE!!! :frowning:

OK, gib doch mal einen Satz von konkreten Beispielkoordinaten
hier an, und zwar so, wie Du sie programmiert hast. Dann
kann man auch gleich die Programmiersprache erkennen :wink:

Ich denke, man muß nur die sog. „Eulerwinkel“ ausrechnen
und das sollte es gewesen sein.

Eulerwinkel klingt interessant :smile:
Programmiert ist das ganze in LScript, Skriptsprache für Lightwave. Deshalb hier erstmal nur der code, koordinaten holt der sich direkt aus dem lightwave objekt. aber kann ich gerne rausschreiben, falls es noch nötig sein sollte… achja, wie man sieht, mag lscript minus-operationen nich so, da muß man tricksen, dann siehts halt so aus wie unten…

main
{
editbegin();
ww=polyinfo(polygons[1]);
v1=pointinfo(ww[2]);
v2=pointinfo(ww[3]);
v3=pointinfo(ww[4]);

ex1=v1.x;
ey1=v1.y;
ez1=v1.z;

ex2=v2.x;
ey2=v2.y;
ez2=v2.z;

ex3=v3.x;
ey3=v3.y;
ez3=v3.z;

er1=ex2+(-ex1);
er2=ey2+(-ey1);
er3=ez2+(-ez1);

es1=ex3+(-ex1);
es2=ey3+(-ey1);
es3=ez3+(-ez1);

nx=(er2*es3)+(-(er3*es2));
ny=(er3*es1)+(-(er1*es3));
nz=(er1*es2)+(-(er2*es1));

fac2=sqrt(nx*nx+ny*ny+nz*nz);
fac3=acos(nz/fac2);

winkel3=deg(fac3);
fac3=acos(ny/fac2);

winkel2=deg(fac3);
fac3=acos(nx/fac2);

winkel1=deg(fac3);

info("x " + winkel1);
info("y " + winkel2);
info("z " + winkel3);
}