PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Punkt rotieren


Einfachkrank
2003-07-03, 19:35:04
Hi,

ich habe da mal ein kleines Problem! Ich möchte einen Punkt in einem 3D Koordinatensystem um jeweils alle drei Achsen drehen können. Das man das mit Sinus und Cosinus bewerkstelligt ist mir klar und auch dessen Theorie, aber ich bekomm es trotzdem nicht hin :D.

Könnt ihr mir das vielleicht mal theoretisch und vielleich auch in Syntax(in C/C++) Form zeigen? Dabei angenommen, ein Array P mit drei Einträgen sei der Punkt - oder ist das dann ein Ortsvektor? Worin besteht denn da eigentlich der Unterschied zwischen Ortsvektor und einem Punkt?

MFG Einfachkrank

Xmas
2003-07-03, 19:54:20
Ein Ortsvektor ist ein Vektor vom Ursprung zu einem Punkt, ein Punkt ist... ein Punkt eben. Der Vektor hat eine Länge und eine Richtung, der Punkt nicht. In der Zahlenmäßigen Darstellung sind sie identisch, und du kannst sie auch praktisch identisch behandeln, das wird sowieso immer untereinander vertauscht ;)

Zur Drehung, wenn du z.B. um die x-Achse drehen willst, sieht das so aus:

Q[0] = P[0];
Q[1] = cos(phi) * P[1] - sin(phi) * P[2];
Q[2] = sin(phi) * P[1] + cos(phi) * P[2];

Um die Y-Achse:

Q[2] = sin(phi) * P[2] + cos(phi) * P[0];
Q[1] = P[1];
Q[0] = cos(phi) * P[2] - sin(phi) * P[0];

Um die Z-Achse:

Q[0] = cos(phi) * P[0] - sin(phi) * P[1];
Q[1] = sin(phi) * P[0] + cos(phi) * P[1];
Q[2] = P[2];


Alles für ein rechtsorientiertes Koordinatensystem (rechte Hand).

Einfachkrank
2003-07-04, 09:34:34
Danke :). So ähnlich hatte ich das auch, aber trotzdem hatte irgendwas nicht funktioniert ??? Egal, jetzt funktionierts jedenfalls.

Einfachkrank
2003-07-05, 18:25:24
Hi,

hab noch mal ne kleine Erweiterung dazu: Und zwar möchte ich eine Figur um ihren Mittelpunkt drehen. Dazu hab ich erst in einer Schleife deren Vertices durchgegangen und nach jeweils dem größten und kleinsten X-, Y- und Z-Wert gesucht und diese in nem Array gespeichert. Dann hab ich den größten und kleinsten Wert, jeweils von X, Y und Z addiert und halbiert um einen Drehpunkt zu bekommen? Und diesen Rotationspunkt subtrahiere ich von den einzelnen X, Y und Z Werte der Vertices bevor ich sie drehe und addiere sie hinterher wieder dazu. Aber wenn ich dann die Figuren drehe, dann wird sie bei einer Drehung um die X-Achse um einen sich verändernden Punkt gedreht, bei einer Drehung um die Y-Achse immer um 90° hin und her gekippt und bei einer Drehung um die Z-Achse, verformt sich die Figur total und ich habe keinen Plan warum!!

Ist meine Vorgehensweise denn richtig? Oder mache ich von dem logischen Weg, etwas falsch?

MFG Einfachkrank

Xmas
2003-07-05, 21:13:49
Original geschrieben von Einfachkrank
Hi,

hab noch mal ne kleine Erweiterung dazu: Und zwar möchte ich eine Figur um ihren Mittelpunkt drehen. Dazu hab ich erst in einer Schleife deren Vertices durchgegangen und nach jeweils dem größten und kleinsten X-, Y- und Z-Wert gesucht und diese in nem Array gespeichert. Dann hab ich den größten und kleinsten Wert, jeweils von X, Y und Z addiert und halbiert um einen Drehpunkt zu bekommen?
Das ist eine mögliche Variante um einen Punkt zu finden, der "irgendwie mittig" liegt. Normalerweise wird aber ein Model schon so erzeugt, dass der Ursprung im Model Space der gewünschte Drehpunkt ist. Für die Berechnung des Masseschwerpunkts gibt es andere Algorithmen. Aber am besten setzt du den Drehpunkt von Hand, d.h. du verschiebst das Model (dauerhaft) im Model Space so, dass der Drehpunkt der Ursprung ist.

Und diesen Rotationspunkt subtrahiere ich von den einzelnen X, Y und Z Werte der Vertices bevor ich sie drehe und addiere sie hinterher wieder dazu.
Grundsätzlich das richtige Vorgehen, du Transformierst das Objekt sozusagen vom Model Space in den "Drehspace", und dann wieder zurück. Aber wie führst du diese Transformation praktisch durch? Poste mal ein wenig Code.

Demirug
2003-07-05, 21:26:15
Einfachkrank, ich glaube es wird Zeit das du dich ein wenig mit Transformationsmatrixen beschäftigst. Dann wird das alles viel einfacher. :D

Einfachkrank
2003-07-06, 15:12:51
Alles um den Ursprung zu drehen ist ja nicht das Problem, sondern ich habe im Programm so einen kleinen Modus eingebaut, dass man nur bestimmte Teile des Models markieren kann und dann diese drehen und transformieren kann. Nur wie gesagt, beim Rotieren entstehen ein paar ungewollte Effekte... Ich schau erst noch mal drüber und wenn ich nichts finden sollte, dann poste ich mal die Funktionen.