Pfeil eines Vektors in die richtige Richtung drehen, aber wie?
-
Hi all,
Ich schreibe gerade für mein Informatiklehrer ein Programm( in OpenGL ) mit dem man Vektoren im 3D-Koordinatensystem darstellen kann.
Vorweg gleich erstmal es sind im Moment nur Ortsvektoren die dem Punkt( 0/0/0 ) entspringen. Über eine Editbox soll der Benutzer nun einen Punkt A angeben( in dieser Form: "x/y/z" ), mit einen Parser lese ich nun alle drei Koordinaten in die Variablen x, y und z ein und die übergebe ich einer Funktion die mir nun den Vektor ins KS zeichnen soll:// ... glBegin( GL_LINES ); // ***** start from O ***** glVertex3f( 0.0f, 0.0f, 0.0f ); // ***** to x/y/z ***** glVertex3f( -xPos, -yPos, -zPos ); glEnd( ); // ...... weiter in dieser Funktion soll anschließend ein Kegel am Endpunkt des Vektors "aufgesetzt" werden, halt damit man sieht in welche Richtung der Vektor läuft. an den Endpunkt vom Vektor zukommen mit dem Kegel ist einfach:
// ... glPushMatrix( ); glTranslatef( -xPos, -yPos, -zPos ); gluCylinder( obj, ( ( froom / froom ) * 0.045f ), 0, ( ( froom / froom ) * 0.2 ), 30, 30 ); glPopMatrix( ); // ......aber wie drehe ich nun den Kegel in die richtige Richtung?, sicher mit der Funktion Rotatef( ), nur wie bekomme ich jetzt nun die richtigen Winkel für x,y und z herraus um den Kegel zu drehen?
Mein ansatz war ja mit den Anstieg( m ) und dann mit tanα an die Sache heran zu gehen hat aber irgendwie nicht funktioniert.Wär euch wirklich dankbar, wenn ihr mir mit dem Problem helft. Falls in diesem SubForum keiner ne Antwort weiß würde ich dieses Thread auch gerne in die Mathe-Abteilung shcieben lassen, Danke schon mal.
Gruß Tobi.
-
Du setzt eine Transformationsmatrix.
Diese Matrix besteht aus 3 (normierten) Basisvektoren.
Einer (jener der der Hoehenrichtung des Kegels entspricht) ist Dein Vektor (xPos, yPos, zPos).
Der naechste steht Senkrecht auf dem vorherigen (es gibt beliebig viele, welchen Du nimmst ist egal und beschreibt nur die Rotation des Kegels um sich selbst).
Der dritte ist das Kreuzprodukt der ersten beiden.
Fuer Details kannst Du Dir die Implementierung von gluLookAt ansehen.
-
aehm ich hab kein Wort verstanden, könntest du mir das noch irgendwie nen bissel vereinfachter erklären? du musst Wiseen eigentlich habe ich noch keine Ahnung von Vektorrechnung

-
Ich schreibe gerade ein Programm in OpenGL
eigentlich habe ich noch keine Ahnung von Vektorrechnung
das geht nicht gut einher und darum schlage ich dringend vor, eine einfuehrung in vektoren und matrizen und zu ergooglen.
-
könntest du mir nen einfach nen bissel code posten wie du das oben meinst? würde mir sicher auch schon helfen
-
Das ist Mathematik ;o
-
ja schon aber ich kann trotzdem nichts mit so einer kleinen notitz anfangen. könnt ihr euch net einfach erbarmen? bidde?
Ich steig nicht ganz hinter, ich weiß das ich mit 3vektoren arbeiten soll, gell?
aber mit was ner funktion gluLookAt() ist die nicht nur für die kameraeinstelung?
-
is doch so oder?
oder haette jemand nen beispiel wie man gluLookAt zur ausrichtung von Objecten benutzen kann?
-
mit lookAt() hat das nichts zu tun. Mittels der ViewTransformation führst du nur einen Basiswechsel vom WorldSpace in den ViewSpace aus.
Recht einfach könntest du es so machen:
Du erzeugst den Kegel zentriert im Ursprung. Dann errechnest du dir die 2 Winkel deines Vektors: einmal den zur Y-Achse und dann den zwischen orthogonaler Projektion in die xz-Ebene und der x-Achse. Dann erzeugst du dir eine Rotationsmatrix R = Rz * Ry und richtest damit deinen Zylinder aus. Abschließend musst du ihn nur noch an die Spitze des Vektors verschieben.
-
gibts das auch für nen 13Klässler auf deutsch? wir hatten noch keine matrizen ect. und um mich da jetz mal eben einzuarbeiten sind meine ferien zu kurz... please einfach nur ein bisschen code. wär echt supi nett.Gruß Tobi.
-
Vielleicht schreib ich nachher schnell was. Aber jetzt muss ich erstmal Late Knights schaun ;P
-
okay, vieln dank, ich wär dir echt sehr verbunden, weil von dieser arbeit ne menge abhängt und ich sowieso schon unter zeit druck stehe... Danke
Gruß Tobi.
-
So, hab jetzt mal schnell was zusammengehackt. Der Code ist DirectX, aber das Prinzip sollte erkennbar sein.
// init Vertex line[2]; // Die Linie aus 2 Vertices. line[0] ist Startpunkt line[1].x = 1; // Beispielhaft ein Vektor mit Endpunkt (1,2,1) line[1].y = 2; line[1].z = 1; line[1].color = D3DCOLOR_XRGB(0, 255, 0); // Zylinder erzeugen (= Pfeilspitze) D3DXCreateCylinder(d3d9Device, 0.001, 0.1f, 0.5f, 10, 10, &mesh, NULL); // Der Render-Code: float zAngle, yAngle; // die 2 erwähnten Drehwinkel um die z bzw. y-Achse D3DXVECTOR3 yAxis(0, 1, 0), xAxis(1, 0, 0); D3DXVECTOR3 v, vProjOnXZplane; v.x = line[1].x; v.y = line[1].y; v.z = line[1].z; vProjOnXZplane.x = v.x; vProjOnXZplane.y = 0; vProjOnXZplane.z = v.z; D3DXVec3Normalize(&v, &v); D3DXVec3Normalize(&vProjOnXZplane, &vProjOnXZplane); zAngle = acos(D3DXVec3Dot(&yAxis, &v)); yAngle = acos(D3DXVec3Dot(&xAxis, &vProjOnXZplane)); if(v.z < 0) // cos(alpha) = cos(-alpha). wenn yAngle z.B. 45° schauen wir yAngle*=-1; // deshalb einfach, ob der Punkt vor oder hinter der xy-Ebene liegt D3DXMATRIX transform, trans, rotX, rotY, rotZ, trans2; // trans und rotX kannst du ignorieren (DX spezifisch. Dient nur dazu den Zylinder so auszurichten, dass er im Ursprung steht und nach oben zeigt) D3DXMatrixTranslation(&trans, 0, 0, -0.25f); D3DXMatrixRotationX(&rotX, D3DX_PI * 0.5f); D3DXMatrixRotationZ(&rotZ, -zAngle); D3DXMatrixRotationY(&rotY, -yAngle); D3DXMatrixTranslation(&trans2, line[1].x, line[1].y, line[1].z); // Diese Zeile ist die ganze Quintessenz (trans und rotX wieder ignorieren!) // Du rotierst erst um Z, dann um Y und anschließend verschiebst du die Pfeilspitze an die Spitze des Vektors transform = trans * rotX * rotZ * rotY * trans2; // Zeichne Vektor D3DXMatrixIdentity(&world); d3d9Device->SetTransform(D3DTS_WORLD, &world); d3d9Device->DrawPrimitiveUP(D3DPT_LINELIST, 1, line, sizeof(Vertex)); // Zeichne Pfeilspitze d3d9Device->SetTransform(D3DTS_WORLD, &transform); mesh->DrawSubset(0);Hier nen kleiner Screenshot wie das ganze dann aussieht: http://www.infoboard.org/screenshots/pfeil.PNG
-
Jo danke, auch wenn ich nichts mit den DX funktionen anfang kann ist mir vorhin dank ich schon der fehler bei mir auf gefallen, denn ich wollts ja eigentlich so machen:
Y ^ | / <--- Vektor |./ /|/. ------+------>X \|/ | \ | \ Winkel Alpha1 | / <--- Vektor |./ /|/. ------+------>X \|/ | \ | \ v Winkel Alpha2 Zwollte die beiden Winkel mit dem Anstieg ausrechnen also:
Y2 - Y1 m1 = ------- ==> m1 = tan( alpha ) ==> alpha1 = atan( m1 ) X2 - X2 Y2 - Y1 m2 = ------- ==> m2 = tan( alpha ) ==> alpha2 = atan( m2 ) X2 - X2was ich aber vergessen hatte war das Bogenmaß in Gradmaß umzurechnen
Gradmaß = ( Bogenmaß * 180 ) ------------------ PIalso ich werds noch mal versuchen und hoffen das es jetzt klappt, danke euch erst mal allen.
Gruß Tobi
-
hmm wieso nimmst du den acos? dachte man macht das mit tan?
und wie arbeiten die funktionen hier?
zAngle = acos(D3DXVec3Dot(&yAxis, &v));
yAngle = acos(D3DXVec3Dot(&xAxis, &vProjOnXZplane));
-
Das Skalarprodukt heißt auf englisch Dot product.
-
hm ok und wie errechne ich das in opengl, hab ich da auch so funktionen mit den ich das machen kann?
-
T0bi schrieb:
hm ok und wie errechne ich das in opengl, hab ich da auch so funktionen mit den ich das machen kann?
Er hat dir den Wikipedialink doch gegeben. Ein Epsilon Eigeninitiative waere toll

Das Skalarprodukt 2er Vektoren (a, b, c) und (x, y, z) ist ganz einafch a*x + b*y + c*z
-
gibts das auch für nen 13Klässler auf deutsch?
wir hatten noch keine matrizen ect.Darf ich mal fragen, was das fuer eine Schule ist?
-
heißt das dann das die jeweils in der ebene liegende ache Null ist?