Guybrush Threepwood Geschrieben 15. Juli 2005 Geschrieben 15. Juli 2005 Da ich mich zur Zeit ein bisschen mit DirectX befasse bin ich auf folgendes Problem gestoßen: Ich habe ein xyz Koordinatensystem, wobei die X-Achse horizontal und die y-Achse vertikal verläuft. Die Z-Achse stellt die Tiefe dar. In diesem Koordinatensystem wird nun ein hohler Zylinder ohne Boden und ohne Deckel dargestellt. Der Zylinder selber besteht aus lauter kleinen Dreiecken. Um die Dreiecke (jedes besteht aus 3 Punkten die miteinander Verbunden werden) darzustellen, werden die Koordinaten der Punkte in folgender Schleife berechnet: for( DWORD i=0; i<50; i++ ) { FLOAT theta = (2*D3DX_PI*i)/(50-1); pVertices[2*i+0].position = D3DXVECTOR3(sinf(theta),-1.0f, cosf(theta)); pVertices[2*i+1].position = D3DXVECTOR3(sinf(theta), 1.0f, cosf(theta)); } [/PHP] D3DXVECTOR3 stellt lediglich eine Struktur dar die die Koordinaten in der Reihenfolge x,y,z beinhaltet. D.h. x ist der sinus von theta y ist -1 bzw 1 z ist der cosinus von theta und das ist auch mein Problem für mich ergibt die Schleife nicht viel Sinn. Ich sehe nur das irgendwas berechnet wird und das dann der Zylinder rauskommt, aber ich verstehe die Rechnung nicht. Wer kann mir helfen? Zitieren
Klotzkopp Geschrieben 15. Juli 2005 Geschrieben 15. Juli 2005 Wenn du einen Winkel von 0 bis 2 pi laufen lässt, und den Sinus des Winkels als x und den Cosinus als y interpretierst, bekommst du einen Kreis. Oder ist dir nicht klar, wie darauf Dreiecke werden? Zitieren
Guybrush Threepwood Geschrieben 15. Juli 2005 Autor Geschrieben 15. Juli 2005 Nee ich glaube das erstere ist mir nicht so ganz klar Das heißt also das mit jedem Schleifendurchlauf Punkte auf einem Kreis festgelegt werden und dann die verschiedenen Kreise zu einem Zylinder verbunden werden? Aber dann wären es doch nur 2 Punkte in jedem Kreis und müsste der Zylinder dann nicht auf der Seite liegen anstatt zu stehen (was er jetzt tut)? Zitieren
Klotzkopp Geschrieben 15. Juli 2005 Geschrieben 15. Juli 2005 Das heißt also das mit jedem Schleifendurchlauf Punkte auf einem Kreis festgelegt werden und dann die verschiedenen Kreise zu einem Zylinder verbunden werden?Verbunden wird noch nichts. Das ist erst mal nur ein Array von Vertices. Irgendwoanders wird gesetzt, dass die als Stripe interpretiert werden, d.h. 0, 1 und 2 bilden ein Dreieck, 2, 1 und 3 das nächste usw. Aber dann wären es doch nur 2 Punkte in jedem Kreis und müsste der Zylinder dann nicht auf der Seite liegen anstatt zu stehen (was er jetzt tut)?Nein, jeder Kreis hat 50 Punkte und liegt in einer Ebene parallel zur xz-Ebene, einer auf y=1 und einer auf y=-1. Zitieren
Guybrush Threepwood Geschrieben 15. Juli 2005 Autor Geschrieben 15. Juli 2005 Nein, jeder Kreis hat 50 Punkte und liegt in einer Ebene parallel zur xz-Ebene, einer auf y=1 und einer auf y=-1. Achso, ich glaube jetzt hats *klick* gemacht, der ganze Zylinder besteht also nur aus 2 Kreisen die jeweils 50 Punkte haben? Wenn das so stimmt dann läuft das doch nach dem Prinzip welches hier unter Kapitel 1.2 dargestellt wird ab. Bekomme ich dadurch das ich für die Berechnung des Sinus und des Kosinus die selben Werte benutze die gegenüberliegenden Punkte auf dem Kreis? Zitieren
Guybrush Threepwood Geschrieben 15. Juli 2005 Autor Geschrieben 15. Juli 2005 Cool Aber dann hätte ich noch eine Frage zu FLOAT theta = (2*D3DX_PI*i)/(50-1); [/PHP] 2*D3DX_PI*i wäre ja der Umfang eines Kreises mit dem Radius i. Aber der Radius des Zylinders bleibt doch immer gleich und warum brauche ich überhaupt den Umfang/(50-1)? ***EDIT*** Moment ich glaub ich habs: Dadurch erhalte ich die Größe des Winkels Alpha bei 50 Punkten (wenn man bei 0 anfängt) mit dem gleichem Abstand? Zitieren
Klotzkopp Geschrieben 15. Juli 2005 Geschrieben 15. Juli 2005 Dadurch erhalte ich die Größe des Winkels Alpha bei 50 Punkten (wenn man bei 0 anfängt) mit dem gleichem Abstand?Richtig. Den Radius der Kreise könntest du mit einem Faktor vor sinf und cosf beeinflussen. Zitieren
Guybrush Threepwood Geschrieben 15. Juli 2005 Autor Geschrieben 15. Juli 2005 Cool vielen Dank!! :uli Zitieren
Bubble Geschrieben 15. Juli 2005 Geschrieben 15. Juli 2005 Moment ich glaub ich habs: Dadurch erhalte ich die Größe des Winkels Alpha bei 50 Punkten (wenn man bei 0 anfängt) mit dem gleichem Abstand? Theta ist in dem Beispiel der Öffnungswinkel eines einzelnen "Kuchenstücks", aus dem sich die Kreise zusammensetzen, zwischen denen später die Röhre aufgespannt wird. Bei Deiner Schleife haben der erste und der letze Punkt allerdings die gleichen Koordinaten: a = 2*pi*0/49 = 0 b = 2*pi*49/49 = 2*pi => sin(a)=sin( Für die Darstellung einer Röhre wäre daher einer der Punkte verzichtbar. Zitieren
Klotzkopp Geschrieben 16. Juli 2005 Geschrieben 16. Juli 2005 Bei Deiner Schleife haben der erste und der letze Punkt allerdings die gleichen Koordinaten:Das ist Absicht. Da die letzen Vertices eines Stripes nicht wieder mit den ersten verbunden werden (man muss ja auch Flächen darstellen können, die nicht in sich selbst geschlossen sind), wäre sonst eine Lücke in der Röhre. Zitieren
Bubble Geschrieben 16. Juli 2005 Geschrieben 16. Juli 2005 Das ist Absicht. Da die letzen Vertices eines Stripes nicht wieder mit den ersten verbunden werden (man muss ja auch Flächen darstellen können, die nicht in sich selbst geschlossen sind), wäre sonst eine Lücke in der Röhre. In keinem der Postings steht etwas von Strips, Dreiecken oder Flächen, es ging nur um die Berechnung von Punkten auf einem Kreis. Und hier berechnet er einen Punkt doppelt. Wie er seinen Zylinder tatsächlich darstellt hat er nicht erwähnt. Die Vorgehensweise wäre auch unterschiedlich, je nachdem ob er nun Triangle-Strips oder normale (einzelne) Dreiecke verwendet. (Er selbst spach im Ausgangsposting von Dreiecken, nicht von Strips.) Zitieren
Klotzkopp Geschrieben 16. Juli 2005 Geschrieben 16. Juli 2005 In keinem der Postings steht etwas von Strips, Dreiecken oder Flächen, es ging nur um die Berechnung von Punkten auf einem Kreis. Und hier berechnet er einen Punkt doppelt. Wie er seinen Zylinder tatsächlich darstellt hat er nicht erwähnt.Da hast du natürlich Recht. Aber die Art und Weise, wie der Array mit den Vertices befüllt wird, legt eine Verwendung als Strip nahe (auch mit der Schreibweise hattest du Recht ) Zitieren
Guybrush Threepwood Geschrieben 16. Juli 2007 Autor Geschrieben 16. Juli 2007 So da bin ich nach langer Zeit wieder :hells: Ich hab am Wochenende nochmal ein bisschen mit Direct3D rumgespielt (neuerdings mit C# aber das nur am Rande). Ich hab jetzt ein Obejct das ich darstelle und auf das ich draufschaue. Das heißt meine Kamera m_Device.Transform.View = Matrix.LookAtLH(m_CameraPos, new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f)); [/PHP] schaut von dem Punkt m_CameraPos auf den Punkt 0,0,0. Jetzt möchte ich mit den Pfeiltasten Links/Rechts jeweils um den Punkt auf den die Kamera schaut rotieren. Also wenn man nach Links drückt soll lin linker Richtung um das Object rotiert werden und nach rechts halt rechts rum. Ich hab mir jetzt gedacht ich mach das ähnlich wie das Anlegen der Punkte für den Zylinder oben und berechne mir so die neuen Positionen der Kamera auf der X und Z Achse. [PHP] void Test1_KeyDown(object sender, KeyEventArgs e) { double theta; switch (e.KeyCode) { case Keys.Right: m_Point++; if (m_Point > 360) m_Point = 0; theta = (2 * Math.PI * m_Point) / (360 - 1); m_CameraPos.X = (float)Math.Cos(theta); m_CameraPos.Z = (float)Math.Sin(theta); break; case Keys.Left: m_Point--; if (m_Point < 0) m_Point = 360; theta = (2 * Math.PI * m_Point) / (360 - 1); m_CameraPos.X = (float)Math.Sin(theta); m_CameraPos.Z = (float)Math.Cos(theta); break; } } Also m_Point wird jeweils zwischen 0 und 360 verringert oder erhöht und damit die neuen Punkte für die Kamera berechnet. Aber irgendwie kommen da ganz komische Bewegungen zu Stande bzw. springt er erstmal von der Startansicht http://img248.imageshack.us/img248/2776/86452968wu5.jpg auf eine Draufansicht http://img177.imageshack.us/img177/8905/53522555qp3.jpg was erstmal nicht so tragisch ist weil ich bestimmt nur einen Wert auf die Z Achse drauf rechhen muss damit er weiter weg ist (glaube ich). Aber die Drehung läuft irgendwie immer im Uhrzeigersinn, dabei müsste sie doch dadurch das m_Point einmal erhöht und einmal verringert wird in verschiedene Richtungen laufen oder nicht :confused: Zitieren
Klotzkopp Geschrieben 16. Juli 2007 Geschrieben 16. Juli 2007 Im einen Fall berechnest du X aus dem Sinus und Z aus dem Cosinus, im anderen Fall andersherum. Da solltest du dich schon auf eines festlegen Und warum teilst du durch 359? :confused: Zitieren
Guybrush Threepwood Geschrieben 16. Juli 2007 Autor Geschrieben 16. Juli 2007 Im einen Fall berechnest du X aus dem Sinus und Z aus dem Cosinus, im anderen Fall andersherum. Da solltest du dich schon auf eines festlegen hmm das ergibt Sinn und ich habs tatsächlich nicht gesehen :schlaf: Und warum teilst du durch 359? :confused: Naja oben in dem Beispiel mit dem Zylinder wird doch auch durch 49 geteilt also hab ich das hier auch einfach mal gemacht PS: Um das Problem mit der Z Achse und das er da so komisch nah dranspringt zu lösen hab ich das jetzt einfach alles mal 5 genommen :hells: und jetzt rotiert er da genau so drum wie ich das wollte :bimei case Keys.Right: m_Point++; if (m_Point > 360) m_Point = 0; theta = (2 * Math.PI * m_Point) / (360 - 1); m_CameraPos.X = (float)Math.Sin(theta) * 5; m_CameraPos.Z = (float)Math.Cos(theta) * 5; break; case Keys.Left: m_Point--; if (m_Point < 0) m_Point = 360; theta = (2 * Math.PI * m_Point) / (360 - 1); m_CameraPos.X = (float)Math.Sin(theta) * 5; m_CameraPos.Z = (float)Math.Cos(theta) * 5; break; [/PHP] Hab zwar keine Ahnung warum aber das muss ich mir heute Abend mal anschauen wenn ich etwas mehr Zeit habe :beagolisc Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.