![]() |
---|
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 . 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: point point2 normal = point2 - point normal = normalize(normal) up 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: vec3(punkt1.x, punkt1.y, punk1.z) normalize(n1); vec3(punkt2.x, punkt2.y, punkt2.z) normalize(n2); ergebis = acos Ich bedanke mich jetzt schonmal um eure Bemühungen. mfg Ercan 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: Parallelverschiebung Rechnen mit Vektoren - Einführung Rechnen mit Vektoren - Fortgeschritten Skalarprodukt |
![]() |
![]() |
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 |
![]() |
Ja wir software entwickler mit unserem Pseude codes :-) Ich versuche es mal in Worten zu erklären. Ich habe zwei Vektor Punkte . Ein Objekt . ein Würfel) wird auf positioniert und dann auf ausgerichtet, so dass es auf Punkt 2 also "guckt". Mein Würfel wird dann mit einem Matrix rotiert und positioniert. Zunächst erzeuge ich einen Richtungsvektor, den ich mal rv nenne, indem ich mache. rv ist also: rv Jetzt wir rv normalisiert. rv = normalize(rv) Jetzt erzeugen wir einen UpVektor, der also Senkrecht zum Normal vektor steht. upvektor 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. |
![]() |
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 . ein stützvektor und dazu 2 vektoren, die die ausrichtung representieren, .ä.)? zuerst verschiebst du also den . 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 . 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 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 haben? also, glaubst du es gibt einen fehler weil dieser winkel nicht ist, oder willst du nur eine "begradigung" hinterherschieben? lg |
![]() |
Matrix transformationen werden in der Technik verwendet, um Objekte zu drehen, verschieben und skalieren. Matrizien repräsentieren dann diese transformationen. Ich möchte nur diesen angegebenen winkel finden (im bild grün), um es zu begradigen, ja. |
![]() |
ehm, ok, von mir aus sollte das nur mit einer 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 . representiert wird..? und was genau diese ausrichtung macht..? und dann sollte man entspr. spezifizieren können, welchen winkel man im allgemeinen "begradigen" will. lg |
![]() |
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. |
![]() |
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 |
![]() |
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. |
![]() |
ok, sag das doch gleich. also, wenn du . java benutzt wirst du irgendeine klasse von objekten haben, welche den würfel beschreiben (also . 3 vektoren). dann würde . ein vektor die richtung der seite/kante representieren, welche du "begradigen willst". |
![]() |
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, 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 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 vektoren zu berechnen, und stinknormale euler rotation durchführen. |
![]() |
hast du jetzt also gefunden, wonach du gesucht hast? schön! lg |
![]() |
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 . einen Finger als objekt hättest, und den Finger an einem Vektor zeigen müsstes. Der Finger muss ja in 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. |
![]() |
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 :-) |