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

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

1

01.02.2005, 15:59

eigene Transformation eines 3d-punktes in 2d

Hallo zusammen,

mein Problem: ich möchte für ein Programm einige Beschriftungen vornehmen. Hierzu will ich einen bestimmten Punkt im 3D-Raum nehmen, diesen transformieren (nach 2d) und an dieser Stelle den Text anzeigen.

Nun zu meiner Theorie: ich hatte zum Testen einen beliebigen 3D-Vektor gewählt. Nun transformiere ich diesen Vektor mit der Funktion

C-/C++-Quelltext

1
 D3DXVec3TransformCoord 

erst mit der Welt-, dann mit der Sicht- und zum Schluss mit der Projektionsmatrix. Nun dachte ich, ich hätte eine "eigene Transformationspipeline". So, nun müsste ich doch einen transformierten 3d-Vektor auf Bildschirm-Koordinaten transformiert haben, also nehm ich für ein RECT die x-Koordinate des nun (hoffentlich) 2d-punktes als linkes Ende des RECTs und die y-Koordinate als oberes Ende des RECTs. Die Ecke links unten vom RECT ist einfach untere linke Ecke des Programms.

Das Problem ist nur, dass meine Theorie aus einem mir nicht bekannten Grund nicht funktioniert. Es wird nur links oben ein Text angezeigt - auch wenn der Text z.B. in der Mitte sein sollte.


Ich hoffe, jemand hat mein Problem verstanden und kann mir helfen.

Danke,
unsigned int
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

01.02.2005, 17:17

die reihenfolge der transformationen stimmt.
was du nicht berücksichtigst ist, dass am ende die projektionsmatrix keine bildschirmkoordinaten macht, sondern den punkt in sog. homogene device koordinaten transformiert.

im prinzip koordinaten von -1 bis +1...

0,0 is in der mitte, 1,-1 rechts unten

im prinzip das nach 0,1 clampen und dann einfach mit backbufferwidth bzw. height multiplizieren-> pixelkoords

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

3

01.02.2005, 17:22

ah, cool, danke! muss ich noch ausprobieren, hab jetzt noch keine zeit zu, aber vielen dank schonmal!
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

4

01.02.2005, 17:58

So, hab das jetzt probiert:

Das mit der Breite (also x) klappt wunderbar! Allerdings spinnt die Höhe ein bisschen!? Wenn ich mich in der Höhe bewege, geht der Punkt mit - es verändert sich also auch der Punkt im 3d-raum, mit dem man ihn verbinden würde.

Was ich mache:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
        D3DXVECTOR3     vec3 = D3DXVECTOR3(0,0,0);
    
    D3DXVec3TransformCoord(&vec3,&vec3,&mWeltmatrix);

    D3DXVec3TransformCoord(&vec3,&vec3,&mSichtmatrix);

    D3DXVec3TransformCoord(&vec3,&vec3,&mProjektionsmatrix);

    vec3.y += 1;
    vec3.x += 1;
    vec3.y *= Matab.iHeight /2;
    vec3.x *= Matab.iWidth  /2;


Ich erstelle also einen 3D-Vektor (0,0,0). Diesen transformiere ich. Dann füg ich beiden Koordinatenwerten je einen hinzu, damit links oben die Ecke die Koordinate (0|0) hat, rechts unten folglich (2|2). Nun multipliziere ich das mit der Hälfte der Ausmaße - links oben ist (0|0), rechts unten sollte (800|600) sein. Ist das wenigstens soweit richtig?


[edit]
Was mir auch auffällt ist, dass die transformierten Punkte nicht wirklich übereinstimmen mit den Orten, wo sie hinsollen. So hab ich am Ursprung jeweils die Vektoren (1|0|0) (0|1|0) und (0|0|1) als Linien mit (0|0|0) verbunden - der von mir nun auf den Ursprung gesetzte Punkt liegt aber daneben :( [/edit]
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

01.02.2005, 18:19

links oben is afaik

-1, 1

die y achse is im device space also nach oben positiv...
-> erst umdrehen ;)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

01.02.2005, 18:30

Re: eigene Transformation eines 3d-punktes in 2d

Zitat von »"unsigned int"«

Hallo zusammen,

ich möchte für ein Programm einige Beschriftungen vornehmen


Das geht doch auch mit Texturen und gegebenen falls mit rhw....

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

7

01.02.2005, 18:31

Ok,

du hattest ja schon geschrieben:

Zitat

0,0 is in der mitte, 1,-1 rechts unten


Ich dachte aber, dass das mit dem Minus ein Tippfehler sei ;)

Ok, das geht jetzt, jetzt muss ich nur noch den Fehler finden, warum der Text nicht an (0|0|0) ist, obwohl ers sein sollte...
Aber das krieg ich wohl auch noch hin, naja, vielleicht ;D

Vielen Dank, dot! Hast mir echt geholfen!

unsigned int
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

01.02.2005, 19:07

immer doch ;)

unsigned int

Alter Hase

  • »unsigned int« ist der Autor dieses Themas

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

9

01.02.2005, 22:09

So, ich dachte ja, dass es fehlerfrei ging. Nun war ich vorhin weg, kam wieder, wollte es mit mehreren Punkten als Beschriftung ausprobieren und siehe da: Es ist nicht so, dass alle verschoben sind um einen gewissen Wert, sondern alle Punkte landen übereinander! So sind also alle Beschriftungen übereinander! Nunja, wie ich es genau beschreiben soll, weiß ich nicht ;)
Aber ich finde in meinem Sourcecode keinen Fehler!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//meine eigene Pipeline!

    D3DXMATRIX      matPipeline;
    D3DXMatrixMultiply(&matPipeline,&mWeltmatrix,&mSichtmatrix);
    D3DXMatrixMultiply(&matPipeline,&matPipeline,&mProjektionsmatrix);
    D3DXVECTOR3     Textpunkt = D3DXVECTOR3(1,0,0);
// Punkt transformieren!

    D3DXVec3TransformCoord(&Textpunkt,&Textpunkt,&matPipeline);
    Textpunkt.y *= (-1); // Vorzeichen drehen, damit die Y-Achse wie die X-Achse behandelt werden kann ;)

    Textpunkt.y += 1;
    Textpunkt.x += 1;
    Textpunkt.y *= Matab.iHeight /2;
    Textpunkt.x *= Matab.iWidth  /2;
// setzen des RECTs

    RECT rec2;
    rec2.top = Textpunkt.y;
    rec2.left = Textpunkt.x;
    rec2.bottom = Matab.iHeight;
    rec2.right = Matab.iWidth;
    std::string Texttext = "(1|0|0)";
// Text rendern

    g_pText->Begin();       
    g_pText->DrawText(Texttext.c_str(),-1,&rec2, DT_NOCLIP,0xff000000);     //draw text

    g_pText->End();
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

01.02.2005, 22:17

nutzt doch rhw....
macht es doch viel einfacher...(wenn ich dein prob richtig verstnaden habe)

Werbeanzeige