Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.06.2005, 14:45

Transformierte Vertizes auch für 3D-Objekte

Ich bin gerade an einem Spiel und möchte darin gerne einen Punktezähler einbauen. Da mir die Funktion D3DXCreateText sehr gut gefällt, möchte ich mir daraus in jedem Frame einen 3D-Text generieren lassen, der mir dann in der linken oberen Bildschirmecke angezeigt wird.
Jetzt meine Frage: ist es auch möglich, transformierte Vertizes für 3D-Objekte zu verwenden? Denn ich brauche ja die Bildschirmkoordinaten und nicht die aus dem 3D-Raum.
Mein Projekt: Rise of the Sylvan

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

14.06.2005, 20:27

rendere einfach den 3D teil dann stellste um auf RHW Vertices und renderst den Rest, dann zeichnen.

3

16.06.2005, 12:42

Aber wie soll ich denn dann meinem Spiel sagen, wo er das Modell zeichnen soll? Mit Transformationen geht das ja dann nicht.
Mein Projekt: Rise of the Sylvan

DrthM2001

Alter Hase

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

4

16.06.2005, 13:58

natürlich geht das damit. musst halt in eine richtung transformieren, nicht größe oder so

5

16.06.2005, 14:48

Also ich hab jetzt am Ende der Renderfunktion folgendes gemacht:

Quellcode

1
2
3
4
g_pD3DDevice->SetFVF(D3DFVF_XYZRHW);
    D3DXMatrixTranslation(&mWorld,20.0f,20.0f,0.5f);
    g_pD3DDevice->SetTransform(D3DTS_WORLD,&mWorld);
    m_pScoreModel->DrawSubset(0);

Aber ich seh noch nichts.
Mein Projekt: Rise of the Sylvan

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

6

16.06.2005, 20:29

Was zum Teufel machst du da???

Wenn du da dein 3D Modell zeichnen willst, was ich mir denke, dann ist das falsch. Da das ja 3D ist du willst aber 2D nutzen....

Zu deiner Frage: nein es geht nicht, wie willst du den 3D zeichnen, wenn du 2D benutzt?

Du musst erst den 3D teil (dein Modell) und dann den 2D Teil(die schrift etc) rendern.

Was ich meine ist. RHW Vertices setzen (wie des hier auch schon gemacht hat), alles fertigmachen und dann zeichnen lassen (die 2D Objekte) dann mit SetFVF wieder die Vertices auf 3D setzen, dann dort alles zeichnen lassen, und dann ausgeben - fertig!

Mal ein Tipp:
Vergiss einfach mal die transformierten Vertices. Machs mit untransformieren. Du musst hier die Sichtmatrix (View) und die Perojektionsmatrix auf die Identitäsmatrix setzen, und natürlich die Beleuchtung ausschalten. Der z Wert der Koordinate muss zwischen 0 und 1 sein.

Du kannste dann dein Objekt frei transformieren, rotieren und scalieren.

Ich hoff ich konnt dir helfen!

7

16.06.2005, 20:56

Nein ich will mir ja mit D3DXCreateText ein Textmodell machen und das dann in der Bildschirmecke anzeigen lassen. Dazu wären ja dann bildschirmbezogene Koordinaten nützlich.
Mein Projekt: Rise of the Sylvan

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

16.06.2005, 22:23

Wenn Du eine "Standard"-Projektionsmatrik benutzt - also mit 'nem Winkel von 90° - dann bedeutet das, dass ein Objekt, das genau eine Einheit von der Kamera entfernt ist, genau zwei Einheiten groß sein muss, um den Bildschirm (vertikal) auszufüllen.
Das kannst Du Dir zunutze machen um zu berechnen, an welcher Pixelposition auf dem Bildschirm sich ein Punkt der 3D-Welt befindet (wobei die Koordinaten des Punktes der 3D-Welt relativ zur Kamera vorliegen müssen, also u.U. erst entsprechend transformiert werden müssen).

v2PosOnScreen = { v3Pos.x * fAspect * v3Pos.z * fScreenWidth , v3Pos.y * v3Pos.z * fScreenHeight } , mit v3Pos = Position des Punktes der 3D-Welt relativ zur Kamera

Umgekehrt kannst Du natürlich eine beliebige Bildschirmposition in Raum-Koordinaten (relativ zur Kamera) berechnen, indem Du die Gleichung umstellst.
Theoretisch kann Dir fScreenWidth und fScreenHeight auch egal sein, da Du Deinen Text wahrscheinlich lieber mit relativen Größen positionieren möchtest...

Ich weiss nicht, ob ich jetzt etwas übersehen habe, aber so habe ich das zumindest mal gemacht (wie ich es in Erinnerung habe)...

Der Winkel der Projektion muss natürlich nicht unbedingt 90° sein. Falls nicht, musst Du noch 'nen Tangens berechnen, aber das sollte klar sein... (wenn Du willst, mach ich Dir 'ne Zeichnung ;) )

Eine andere Möglichkeit wäre, den Punkt einfach mit der Projektionsmatrix zu multiplizieren ;)

9

17.06.2005, 10:47

Endlich mal ne gute Antwort. Aber was ist mit der Kamera? Ich kann ja mit den Pfeiltasten die Kamera bewegen.
Mein Projekt: Rise of the Sylvan

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

17.06.2005, 13:36

Nachdem Du die eigentliche Szene gerendert hast, setzt Du die "View" auf folgende Werte (nur ein Beispiel):

Position = { 0.0f , 0.0f , -1.0f }
Orientation = { 0.0f , 0.0f , 1.0f } , bzw. LookAt = { 0.0f , 0.0f , 0.0f }
UpVector = { 0.0f , 1.0f , 0.0f }

Dann positionierst Du Deinen Text z.B. bei { -0.9f * fAspect , 0.9f , 0.0f }. Je nach 3D-Modell des Textes muss dieser evtl. noch skaliert werden, das siehst Du dann ja...

Eine andere Möglichkeit wäre es wiederum, die Kamera (also "View") so zu lassen, wie sie für die Szene bereits eingestellt war. Dann musst Du halt - um die Textposition in der 3D-Welt zu erhalten - noch mit der inversen View-Matrix transformieren (müsste so klappen ;) ).

Werbeanzeige