Mathematik online lernen im Mathe-Forum. Nachhilfe online
Startseite » Forum » Vektoren Ausrichten

Vektoren Ausrichten

Universität / Fachhochschule

Tags: Ausrichten, Ausrichtung, vector, Vektor

 
Antworten Neue Frage stellen Im Forum suchen
Neue Frage
geforcefan

geforcefan aktiv_icon

15:56 Uhr, 30.09.2012

Antworten
Hallo Zusammen.

Zur Zeit arbeite ich an einer Software. Ich stecke gerade in einer Sackgasse, was Vectoren angehen.

Folgende Problematik:

Ich habe zwei Vektoren und z.B. einen Würfel Objekt.

Die Würfel sollte jetzt auf Position von Vektor1 sein und auf Vektor 2 ausgerichtet sein.

Bis jetzt alles kein Problem.

Mit dem folgenden Pseudo Code geht es auch:

=====================================
3 point =(1,1,1)
3 point2 =(5,5,5)
3 normal = point2 - point
normal = normalize(normal)

up =3(0,1,0);
achse = cross(up, normal)
achse = normalize(achse)
angle = getAngleBetweenVectors(up, normal)

matrix4x4 objMatrix;
objMatrix = translate(objMatrix, point)
objMatrix = rotate(objMatrix, angle, achse)
=====================================

Die Ausgabe könnt ihr im Anhang sehen.

Wie ihr es auf dem Bild erkennen könnte, sollte der Winkel 0° grad sein. Also muss ich noch in der Y-Achse um -45° drehen, damit ich auf die 0° komme. Entweder ich habe einen Denkfehler, oder ich komme einfach nicht drauf, die ich die 0° erreichen kann.

In dem Code sieht ihr eine funktion die [b]getAngleBetweenVectors[/b] heißt. Wenn es jemanden interessiert, wird folgendes drin berechnet:

=====================================
3n1= vec3(punkt1.x, punkt1.y, punk1.z)
n1= normalize(n1);
3n2= vec3(punkt2.x, punkt2.y, punkt2.z)
n2= normalize(n2);

ergebis = acos n1,n2.0,01745329252
=====================================


Ich bedanke mich jetzt schonmal um eure Bemühungen.

mfg Ercan


problem

Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert):
"Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen."
Hierzu passend bei OnlineMathe:

Online-Übungen (Übungsaufgaben) bei unterricht.de:
 
Online-Nachhilfe in Mathematik
Antwort
weisbrot

weisbrot aktiv_icon

16:09 Uhr, 30.09.2012

Antworten
hallo!
ich kann leider mit dem preudocode nicht viel anfangen - mir ist nicht klar was diese methoden machen und was für strukturen du verwendest..
vielleicht kannst du deine vorgehensweise (wie representierst du den würfel, was machst du um ihn auszurichten (was bedeutet das ausrichten überhaupt)) kurz ( worten) erläutern.
lg
geforcefan

geforcefan aktiv_icon

16:23 Uhr, 30.09.2012

Antworten
Ja wir software entwickler mit unserem Pseude codes :-)

Ich versuche es mal in Worten zu erklären.

Ich habe zwei 3D Vektor Punkte (x,y,z).

p1=1,1,1
p2=5,5,5

Ein Objekt (z.b. ein Würfel) wird auf p1 positioniert und dann auf p2 ausgerichtet, so dass es auf Punkt 2 also "guckt". Mein Würfel wird dann mit einem 4x4 Matrix rotiert und positioniert.

Zunächst erzeuge ich einen Richtungsvektor, den ich mal rv nenne, indem ich p2-p1 mache.

rv ist also:
rv =p2-p1

Jetzt wir rv normalisiert.

rv = normalize(rv)

Jetzt erzeugen wir einen UpVektor, der also Senkrecht zum Normal vektor steht.

upvektor =0,1,0

Zusammen kann ich eine Achsen Vektor erzeugen. Dazu muss ich aus den richtungsvektor und dem upvektor einen Vektorprodukt erzeugen:

achse = kreuzprodukt(upvektor, rv)

Die achse wird normalisiert:

achse = normalize(rv)

Jetzt brauchen wir den Winkel zwischen den richtungsvektor und unserem upvektor, den kriege ich raus mit einem funktion den ich geschreiben habe.

Jetzt wird nur noch eine matrix rotation auf das objekt durch geführt.

Mehr ist es eigentlich garnicht. Mein Problem ist nur das ich den angegebenen winkel auf dem bild brauche, um eine weitere rotation durchzuführen, sodass ich auf meinen 0° winkel komme...

Ich hoffe das war etwas verständlicher.
Antwort
weisbrot

weisbrot aktiv_icon

16:59 Uhr, 30.09.2012

Antworten
naja, ist ja jetzt nicht so dass ich nicht wüsste wie ein allg. pseudocode zu lesen ist, es muss nur klar sein was die verwendeten methoden machen..;-)

mhhhhhhhhhhhhh.. mir ist zwar immernoch nicht ganz offensichtlich, was du da im detail machst, aber vllt ist das erstmal nicht so wichtig.

ich würd erstmal gerne wissen: wie representierst du den würfel (z.b. ein stützvektor und dazu 2 vektoren, die die ausrichtung representieren, o.ä.)?

zuerst verschiebst du also den w. in richtung vektor1 (das wäre beim beispiel einfach stützvektor = stützvektor + vektor1), ganz einfach.
dann willst du ihn nach vektor2 - vektor1 ausrichten - was bedeutet das? soll er so gedreht werden, dass vektor2 - vektor1 senkrecht auf irgendeine ausgezeichnete seite des w. steht? oder, was das einfachste (und was ich auch zuerst denken würde) wäre, du transformierst die vektoren, die die "(aus)richtung" des würfels representieren, mit der drehungsmatrix von vektor2 - vektor1.

du machst hier auch irgendeine matrixtransformation, aber mit einer 4x4- matrix - was macht das im 3-dimensionalen raum vür einen sinn??

dein vorletzter satz im letzten post hat mich etwas verwirrt - willst du nun das machen, was ich grad beschrieben hab (also die grundaufgabe, wie du sie zuerst beschrieben hast)? oder willst du danach nur diesen winkel =0 haben?
also, glaubst du es gibt einen fehler weil dieser winkel nicht =0 ist, oder willst du nur eine "begradigung" hinterherschieben?
lg
geforcefan

geforcefan aktiv_icon

17:11 Uhr, 30.09.2012

Antworten
Matrix transformationen werden in der 3D Technik verwendet, um Objekte zu drehen, verschieben und skalieren. 4x4 Matrizien repräsentieren dann diese transformationen.

Ich möchte nur diesen angegebenen winkel finden (im bild grün), um es zu begradigen, ja.
Antwort
weisbrot

weisbrot aktiv_icon

17:18 Uhr, 30.09.2012

Antworten
ehm, ok, von mir aus sollte das nur mit einer 3x3- matrix gehen, aber du wirst schon wissen wie das im detail funktioniert;-).
naja, der winkel den du suchst steckt irgendwo in deinem würfel. kommt nun darauf an wodurch der w. representiert wird..? und was genau diese ausrichtung macht..? und dann sollte man entspr. spezifizieren können, welchen winkel man im allgemeinen "begradigen" will.
lg
geforcefan

geforcefan aktiv_icon

17:46 Uhr, 30.09.2012

Antworten
Diese ganze Sache zu erklären ist echt sehr kompliziert. Dazu kommt noch das ich besser Programmieren kann als Mathe. Ah hätte ich doch Mathe studiert :-)

In endeffekt kommt bei meiner Rechnung (was ich oben beschrieben habe) zwei Rotations winkel raus. X-Achse und Z-Achse. Y-Achse ist 0 Grad in meiner rechnung, nur nach der Matrix Rotation ist trotzem diese 45° srin (grün auf dem bild)...

Sehr kompliziert alles.
Antwort
weisbrot

weisbrot aktiv_icon

17:51 Uhr, 30.09.2012

Antworten
scheinbar etwas kompliziert.
ich kann dir aber sicher besser helfen wenn du meine fragen beantwortest (alles das, was vllt. von der syntax her keine frage ist, aber am ende ein "?" hat;-)). lg
geforcefan

geforcefan aktiv_icon

17:58 Uhr, 30.09.2012

Antworten
Ich hab selbst mit Vektoren schwirigkeiten. Mit einem Real abschluss ist es halt so. Deshalb "verstehe" ich deine fragen nicht genau... Deshalb kann ich sie auch nicht beantworten. Sehr verzwickt.
Antwort
weisbrot

weisbrot aktiv_icon

18:37 Uhr, 30.09.2012

Antworten
ok, sag das doch gleich.
also, wenn du z.b. java benutzt wirst du irgendeine klasse von objekten haben, welche den würfel beschreiben (also z.b. 3 vektoren). dann würde z.b. ein vektor die richtung der seite/kante representieren, welche du "begradigen willst".
geforcefan

geforcefan aktiv_icon

18:45 Uhr, 30.09.2012

Antworten
Jetzt verstehe ich es. Siehe den Würfel als ein Objekt der nicht näher Spezifiziert ist.

Die Würfel wird nur in richtung Vektor Punkt 2 gedreht. Deshalb auch jetzt unwichtig warum ich matrizien benutze.

Zum drehen habe ich halt eine funktion:

rotate(winkel, x,y,z)

Nur darauf kommt es an, genau hier liegt auch wahrscheinich mein Problem. Ich hab mit dem Code oben den winkel zwischen den zwei Vektoren gerechnet, und in der achse x,y,z definiert.

Das funktionert ja auch. Mein objekt (die Würfel) wird ja auch in richtung Vektor Punkt 2 gedreht. Das problem ist, das die querneigung nicht 0° ist, sondern je nachdem wo sich die Vektor punkte sich befinden, mit gedreht werden.

In endeffekt ist es nichts anderes als den Winkel zwischen zwei 3D vektoren zu berechnen, und stinknormale euler rotation durchführen.
Antwort
weisbrot

weisbrot aktiv_icon

20:23 Uhr, 30.09.2012

Antworten
hast du jetzt also gefunden, wonach du gesucht hast? schön! lg
geforcefan

geforcefan aktiv_icon

20:28 Uhr, 30.09.2012

Antworten
Nein eben nicht :-) Die Y-Achse, ist immernoch ein Rätsel für mich :-)

Anders:

Wie würdest du denn das Ganze umsetzen, wenn du z.b. einen Finger als objekt hättest, und den Finger an einem Vektor zeigen müsstes.

Der Finger muss ja in X,Y,Z achse gedreht werden.

Evtl. hast du einen besseren ansatz, wie ich die Winkel rausfinde, um den "Finger" zu drehen, so dass es auf einen Vektor zeigt.
Frage beantwortet
geforcefan

geforcefan aktiv_icon

09:29 Uhr, 01.10.2012

Antworten
So, nach langem überlegen habe ich doch nun rausgefunden wie das funktioniert. Ja ich hatte einen Denkfehler.

In meinem "Code" habe ich nur eine UpVektor (also Senkrecht zum Richtungsvektor) gehabt. Natürlich muss ich noch einen SideVektor (also Wagerecht zum Richtungsvektor) erzeugen. Dies wird auch in meiner Matrix zum rotieren hinzgefügt, und schon passt es :-)