Drehen Sie ein 3D - Punkt, um ein weiteres
Ich habe eine Funktion in meinem Programm dreht sich ein Punkt (x_p, y_p, z_p), der um einen anderen Punkt (x_m, y_m, z_m) durch die Winkel w_nx & w_ny. Die neuen Koordinaten werden gespeichert in der globalen Variablen x_n, y_n, und z_n. Rotation um die y-Achse (also die änderung Wert der w_nx - so, dass die y - Werte sind nicht beschädigt) funktioniert, aber sobald ich eine rotation um die x - oder z - Achse ändern Sie den Wert von w_ny) die Koordinaten sind nicht genau mehr. Ich bemerkte auf der Linie ich denke, mein Fehler ist, aber ich kann nicht herausfinden, was falsch mit, dass-code.
Kann mir jemand helfen?
void rotate(float x_m, float y_m, float z_m, float x_p, float y_p, float z_p, float w_nx ,float w_ny)
{
float z_b = z_p - z_m;
float x_b = x_p - x_m;
float y_b = y_p - y_m;
float length_ = sqrt((z_b*z_b)+(x_b*x_b)+(y_b*y_b));
float w_bx = asin(z_b/sqrt((x_b*x_b)+(z_b*z_b))) + w_nx;
float w_by = asin(x_b/sqrt((x_b*x_b)+(y_b*y_b))) + w_ny; //<- there must be that fault
x_n = cos(w_bx)*sin(w_by)*length_+x_m;
z_n = sin(w_bx)*sin(w_by)*length_+z_m;
y_n = cos(w_by)*length_+y_m;
}
- Wenn Ihr mit opengl ich bin sicher, dass eine Grafik-Bibliothek hätte eine matrix und Vektoren implantation, die Sie verwenden können. drehen Sie einen Punkt über eine matrix vereinfachen Sie Ihren Algorithmus.
- Meinst du die "Umsetzung"? 😉
- Wenn Sie nicht bereits vertraut mit dem Begriff, Sie sollten Lesen, auf "Gimbal Lock". Ich kann nicht sofort sagen, ob dein code könnte darunter leiden, aber es ist ein häufiger Fehler, wenn du tust diese Art der rotation mit "Euler-Winkel".
- ich habe versucht, zu verwenden
glrotatef
, aber es dreht sich nur die Zeichnung, nicht die Koordinaten der Eckpunkte, und ich brauche, um zu drehen Sie die Koordinaten, um zu prüfen, Kollisionen!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was der code, der fast funktioniert:
Gibt es zwei Probleme:
Daher in diesem Fall mit matrix-und Vektor-Mathematik helfen:
basic-Drehung Matrizen.
Versuchen, Vektor-Mathematik. entscheiden Sie, in welcher Reihenfolge Sie drehen, zuerst entlang x, entlang y vielleicht.
Wenn Sie drehen entlang der z, [z' = z]
Dasselbe für die y-Achse: [y" = y']
Wieder drehen entlang der x-Achse: [x"' = x"]
Und schließlich ist die Frage des Drehens um einige spezifische "point":
Ersten subtrahiere die Stelle von den Koordinaten, dann gelten die Rotation und schließlich fügen Sie die Nummer zurück, um das Ergebnis.
Das problem, soweit ich sehe, ist ein enger verwandter "gimbal lock". Der Winkel w_ny nicht gemessen werden kann, die relativ zu der fixed xyz -Koordinatensystem, sondern auf das Koordinatensystem gedreht ist, indem die Winkel w_nx.
Als kakTuZ beobachtet, dein code konvertiert Punkt-zu sphärischen Koordinaten. Es ist nichts falsch mit, dass-mit Längen-und Breitengrad erreicht man alle Orte auf der Erde. Und wenn man nicht Sorge über das kippen der Erde äquatorialen Ebene relativ zu der Flugbahn um die Sonne, es ist ok mit mir.
Das Ergebnis nicht drehen die nächste Referenz-Achse entlang der ersten w_ny ist, dass zwei Punkte, die sind 1 km einen Teil von jeder anderen am äquator bewegen sich näher zueinander an den Polen und auf dem Breitengrad von 90 Grad, den Sie berühren. Auch wenn die offensichtliche Ziel ist, Sie zu halten 1 km auseinander, wo immer Sie sind gedreht.
y''
?z'=z
,y''=y'
,x'''=x''
fehlt. Die drei Berechnungen werden matrix-Multiplikationen mit "rotation matrices".x=f(x,y); y=f(x,y);
wenn diese Funktionen durchgeführt werden muss gleichzeitig, wie dargestellt, durch die Wahl der Parameter hier:x'= f(x,y); y' = f(x,y);
Die notation x-prime löst das problem mit der falschen Zwischenergebnissen.z'' = z'*sin b + x' * cos b;
->z'' = x'*sin b + z' * cos b;
undz''' = z'' * sin c + y'' * cos c
->z''' = y'' * sin c + z'' * cos c
. Macht das Sinn?wenn Sie möchten, zu transformieren von Koordinatensystemen, anstatt nur die Punkte, die Sie benötigen 3 Winkeln. Aber Sie haben Recht - für die Umwandlung der Punkte 2 Winkel sind genug. Für details Fragen Sie Wikipedia ...
Aber wenn Sie die Arbeit mit opengl, sollten Sie wirklich opengl-Funktionen wie
glRotatef
. Diese Funktionen werden berechnet auf der GPU, nicht die CPU, als Ihre Funktion. Der doc ist hier.glrotatef
, aber es dreht sich nur die Zeichnung, nicht die Koordinaten, und ich brauche, um zu drehen Sie die Koordinaten, um zu prüfen, KollisionenWie viele andere gesagt haben, sollten Sie glRotatef rotieren zum Rendern. Für die kollisionsbehandlung, erhalten Sie in seine Welt-Raumposition, die durch das multiplizieren seiner position Vektor, die durch die OpenGL-ModelView-matrix auf der Oberseite des Stapels an der Stelle seiner rendering. Erhalten, die matrix mit glGetFloatv, und dann multiplizieren Sie es mit Ihrem eigenen Vektor-matrix-Multiplikation-Funktion, oder verwenden Sie eine der vielen, die Sie erhalten einfach online.
Aber, das wäre ein Schmerz! Stattdessen schauen Sie in mit dem GL-feedback-Puffer. Dieser Puffer wird einfach speichern Sie die Punkte, wo die primitive angelegt hätten, anstatt wirklich zeichnen der primitiven, und dann können Sie auf diese zugreifen.
Diese ist ein guter Ausgangspunkt.