Zum Inhalt springen

Berechnung von Punkten in einem Koordinatensystem


Guybrush Threepwood

Empfohlene Beiträge

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? :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)?

post-16898-14430447185072_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Cool :D

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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(B)

Für die Darstellung einer Röhre wäre daher einer der Punkte verzichtbar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;))
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Jahr später...

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...