vektor rotieren
-
hi,
wie kann man einen vektor im 3d-raum um einem bestimmten Winkel rotieren?
Ich komme einfach nicht drauf. Bzw. fehlt mir Wissen.Also was ich mir überlegt habe ist, dass man eine Ebene braucht auf der dann rotiert wird.
Ich habe weiter gedacht...
Eigentlich braucht man keine Ebene, sondern nur die Normale der Ebene, sozusagen die Rotationsgerade.Hilft mir (im Moment) aber nicht weiter. denn die algemene Formel lautet:
v ist der Ausgangsvektor, w der gedrehte. die Normale komt garnicht vor...
Aber wenn ich das ganze so umforme:
Da gibt es für mich ein paar Probleme:
1. Ist die Division von Skalar durch Vektor definiert?
2. Wenn ja, wie rechne ich weiter?mfg matimatiker
PS: Es ist keine Hausaufgabe, die ich nicht machen will. Ich schreibe nur eine Vektor-Implementierung für eigene Spiele.
-
benutz doch das Kreuzprodukt: wenn dein Vektor v ist und die Rotationsgerade (Normale der Drehebene) n, dann ist n = v x u mit |n| = |v| |u| sin phi (phi zwischen v, u). Also kannst du u passend suchen mit |u| = |v|
-
wirf mal einen blick hier rauf: http://de.wikipedia.org/wiki/Rotationsmatrix
sollte alles drin stehen, was du brauchst.
-
rotator schrieb:
wirf mal einen blick hier rauf: http://de.wikipedia.org/wiki/Rotationsmatrix
sollte alles drin stehen, was du brauchst.
Hab es nur ganz schnell überflogen, aber ich glaube nicht, dass da alles drin steht, was er braucht. Er muss sich eigentlich auch noch mit Basistransformationen auskennen, weil seine Drehachse wohl nicht unbedingt eine der Achsen des "Weltkoordinatensystems" ist.
Ich habe hier ein bischen Code aus meinem Programm, wo genau das gemacht wird. Vielleicht hilft es ja (auch wenn das mal überarbeitet werden muss, weil es nicht so ganz hübsch ist):
public synchronized void rotate(final double horizontalAngle, final double verticalAngle) { final Matrix baseMatrix = new Matrix(new double[3][3]); for (int y = 0 ; y < 3 ; ++y) { baseMatrix.setComponent(0, y, rightDirection.getComponent(y)); baseMatrix.setComponent(1, y, upDirection.getComponent(y)); baseMatrix.setComponent(2, y, direction.getComponent(y)); } final Matrix inverse = baseMatrix.createInvertedMatrix(); final Matrix rotationMatrix = LinearAlgebraMethods.createRotationMatrix(verticalAngle, horizontalAngle, 0); final Matrix functionMatrix = baseMatrix.mulBack(rotationMatrix).mulBack(inverse); rightDirection = functionMatrix.mulBack(new Vector(rightDirection)); upDirection = functionMatrix.mulBack(new Vector(upDirection)); direction = functionMatrix.mulBack(new Vector(direction)); }
Man hat da die aktuelle Blickrichtung als einen Vektor "direction" angegeben. Ensprechend stehen "rightDirection" und "upDirection" senkrecht darauf und zeigen in die entsprechende Richtung. Die Methode nutzt nun rightDirection und upDirection als Rotationsachsen und weist den drei Vektoren dann am Schluss den Wert zu, den sie nach der Rotation einnehmen.
Die zentrale Zeile dabei ist eigentlich folgende:
final Matrix functionMatrix = baseMatrix.mulBack(rotationMatrix).mulBack(inverse);
Da wird die Rotation bezüglich der gegebenen Basis durchgeführt.
-
http://mathworld.wolfram.com/RodriguesRotationFormula.html
von da an findest du genug in google
-
Danke für die Antworten.
Bei Wikipedia steht was ich brauche. Habe bisher aber auch nur überflogen und bin bei Quaternionen gelandet.
Wie es ausssieht muss ich wohl noch einiges lernen... In der Schule (13 Klasse) fehlt die notwendige Vertiefung. Z.b steht Kreuzprodukt gar nicht auf dem Plan. Ist aber schon sinnvoll da man damit viel schneller eine Normale berechnen kann als mit Skalarprodukt.Ich habe bisher nur ein paar 2d spiele gemacht. Wollte jetzt bishen mit 3d experimentieren. Braucht man eigentlich das ganze Wissen über die verschienen matrix-operationen? Habe nur paar Tutorials über opengl angschaut, war nich schwer.
mfg matimatiker
-
@Gregor:
Ist eigentlich nicht der inhalt von createRotationMatrix was ich brauche.LinearAlgebraMethods.createRotationMatrix(verticalAngle, horizontalAngle, 0);
Egal, jetzt weiß wie es geht.
Danke nochmals
-
matimatiker schrieb:
Braucht man eigentlich das ganze Wissen über die verschienen matrix-operationen?
Wenn man in einem Gebiet selbständig arbeiten will, sollte man sich natürlich möglichst viel Wissen in diesem Gebiet aneignen. Ansonsten beschränkt sich das Arbeiten auf diesem Gebiet wohl auf "kopieren" und "ohne viel Verstand mit gewissen Parametern rumspielen".
Computergrafik ist insgesamt ein Gebiet, in dem man sehr viel lineare Algebra anwenden kann. Insofern denke ich, dass es nicht schaden kann, sich auf diesem Gebiet eine gewisse Kompetenz anzueignen. ...und Analysis sollte man auch auf einem gewissen Level beherrschen. Naja, ich benenne das ganze mal anders: Man sollte sich eine gewisse mathematische Modellierungsfähigkeit aneignen, so dass man seine Probleme in der Sprache der Mathematik ausdrücken kann und mit diesen Ausdrücken arbeiten kann.
...meine Meinung. Andere werden Dir sagen, dass man da nicht so viel wissen muss. "Steht ja alles in Tutorials". IMHO ist man dann aber von seinen Fähigkeiten her auch auf diese Tutorials beschränkt.
-
matimatiker schrieb:
@Gregor:
Ist eigentlich nicht der inhalt von createRotationMatrix was ich brauche.LinearAlgebraMethods.createRotationMatrix(verticalAngle, horizontalAngle, 0);
Naja, das steht ja auch auf Wikipedia. ...und das andere letztendlich auch, wie ich inzwischen gesehen habe. In createRotationMatrix wird eine Matrix erstellt, die drei Rotationen um die drei Koordinatensystemachsen realisiert.
-
Im Math-Teil von Grafikengines findet man im Allgemeinen konkrete Umsetzungen zum Thema Rotation, Translation, Skalieren von 3D-Vektoren.
-
uups_ schrieb:
Im Math-Teil von Grafikengines findet man im Allgemeinen konkrete Umsetzungen zum Thema Rotation, Translation, Skalieren von 3D-Vektoren.
Man muss sich aber trotzdem mit der dahinterstehenden Mathematik auskennen. Zum Beispiel sollte man wissen, welche Transformationen kommutativ sind usw., um die angebotenen Methoden auch wirklich gut ausnutzen zu können.