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

Anonymous

unregistriert

1

24.10.2005, 19:42

Fragen zu Beispiel 4 aus Kapitel 2 Seite 163ff

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
struct Texture2DVertexx
{
    tbVector3 position; // Position des Vertex

    DWORD color;        // Farbe des Vertex

    tbVector2 texture;  // Texturkoordinaten

    DWORD   dwFVF;      // Vertexformat

};



tbResult Render(float fNumSecsPassed)
{
    tbMatrix    mScaling;       // Skalierungsmatrix

    tbMatrix    mRotationX;     // Rotationsmatrix für die x-Achse

    tbMatrix    mRotationY;     // Rotationsmatrix für die y-Achse

    tbMatrix    mRotationZ;     // Rotationsmatrix für die z-Achse

    tbMatrix    mTranslation;   // Translationsmatrix

    tbMatrix    mWorld;         // Vereinende Weltmatrix

    

    Dreieck** dreiecke = aquarium->getDreiecke();

    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

    D3D->BeginScene();

    // Projektionsmatrix erstellen und einsetzen

    tbMatrix mProjection = tbMatrixProjection(TB_DEG_TO_RAD(90.0f), D3D.GetAspect(), 0.1f, 1000.0f);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);

    // Kameramatrix

    //tbMatrix mCamera = tbMatrixCamera(tbVector3(0.0f,0.0f,1.0f), tbVector3(0.0f,0.0f,1.0f), tbVector3(0.0f,1.0f,0.0f));

    //D3D.SetTransform(D3DTS_VIEW, mCamera);




    // Z-Buffer deaktivieren, Dithering aktivieren

    D3D.SetRS(D3DRS_ZENABLE, FALSE);
    //D3D.SetRS(D3DRS_DITHERENABLE, TRUE);



        // Skalierungsmatrix anhand der Größe des Dreiecks erstellen

        mScaling = tbMatrixScaling(tbVector3(dreiecke[0][0].getSize()));

        // Rotationsmatrizen für das Dreieck erzeugen

        mRotationX = tbMatrixRotationX(dreiecke[0][0].getRotation().x);
        mRotationY = tbMatrixRotationY(dreiecke[0][0].getRotation().y);
        mRotationZ = tbMatrixRotationZ(dreiecke[0][0].getRotation().z);

        // Translationsmatrix

        mTranslation = tbMatrixTranslation(dreiecke[0][0].getPosition());
        
        // Alle Matrizen kombinieren und als Weltmatrix einsetzen

        mWorld = mScaling * mRotationX * mRotationY * mRotationZ * mTranslation;
        D3D.SetTransform(D3DTS_WORLD, mWorld);

        Texture2DVertexx *textureVertizes = dreiecke[0][0].getVertizes();

        Texture2DVertexx textureVertex[] = 
        {
            textureVertizes[0], textureVertizes[1], textureVertizes[2]
        };

        D3D.SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);

        D3D->DrawPrimitiveUP(D3DPT_TRIANGLELIST,                // Dreiecksliste

                            1,                                                                      // 1 Dreieck

                            textureVertex,                                              // Vertexdaten

                            sizeof(Texture2DVertexx));                      // Vertexgröße

        


    D3D->EndScene();
    
    return TB_OK;
}



tbResult Move(float fNumSecsPassed)
{
    float fDistance;

    // Den Zeitzähler aktualisieren

    g_fTime += fNumSecsPassed;

    Dreieck** dreiecke = aquarium->getDreiecke();

        // Position und Rotation aktualisieren

        dreiecke[0][0].setPosition( dreiecke[0][0].getPosition() + dreiecke[0][0].getVelocity() * fNumSecsPassed );
        dreiecke[0][0].setRotation( dreiecke[0][0].getRotation() + dreiecke[0][0].getRotVelocity() * fNumSecsPassed );

        // Distanz des Dreiecks zum Beobachter (zum Nullpunkt) berechnen

        fDistance = tbVector3Length(dreiecke[0][0].getPosition());

        // Wenn die Distanz größer als 100 ist, soll das Dreieck umkehren.

        if(fDistance > 100.0f) 
            dreiecke[0][0].setVelocity( dreiecke[0][0].getVelocity() * -1.0f);
    }

    return TB_OK;
}

void CreateDreiecke()
{
// Vertizes generieren

        Texture2DVertexx vertizes[3];
        for(int j = 0; j < 3; j++)
        {
            // Position

            tbVector3 position = tbVector3Random();


            // Farbe

            tbColor VertexColor;
            VertexColor.r = tbFloatRandom(0.0f, 1.0f);
            VertexColor.g = tbFloatRandom(0.0f, 1.0f);
            VertexColor.b = tbFloatRandom(0.0f, 1.0f);
            DWORD farbe = (DWORD)(VertexColor);

            // Texturkoordinaten zufällig zwischen -1 und 2 erzeugen

            float textureU = tbFloatRandom(-1.0f, 2.0f);
            float textureV = tbFloatRandom(-1.0f, 2.0f);
            tbVector2 textureKoordinaten(textureU, textureV);

            vertizes[j].position = position;
            vertizes[j].color = 0xffff0000;
            vertizes[j].texture = textureKoordinaten;
            vertizes[j].dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

        }

        // Alle Dreiecke starten am Punkt (0, 0, 50).

        dreiecke[0] = new Dreieck(
            tbVector3(0.0f, 0.0f, 25.0f),
            tbVector3Random() * tbFloatRandom(3.1f, 5.0f),
            tbVector3(0.0f, 0.0f, 0.0f),
            tbVector3Random() * tbFloatRandom(0.1f, -2.0f),
            tbFloatRandom(1.0f, 5.0f),
            vertizes
            );
            
}


Hallo,
ich habe das Beispiel 4 aus Kapitel 2 mit Hilfe der Engine nachgebaut.
Darüber hinaus gibt es ein paar Änderungen. Ich habe eine Aquarium-Klasse welche mehrere Dreiecke beinhaltet.
Die Dreiecke sind mit der Struktur STriangle zu vergleichen. Texture2DVertexx entspricht SVertex.

Es ist nicht der gesamte Quellcode kopiert worden und nur ein Dreieck vorhanden. Ich denke diese Einschränkung hilft eher.

Ein paar Unklarheiten sind bei mir geblieben. Ich hoffe die Fragen sind nicht zu dämlich oder unverständlich ausgedrückt:

1. So weit ich weiss, können Koordinaten der Vertizes höchstens den Wert 1.0 annehmen (x=1.0f entspricht rechter Rand).
Warum wird dann der Starpunkt auf (0,0,50) gelegt? Durch die erstellte Matrix und deren Multiplikation mit dem Vertex wird der Wert doch > 1.0.
Kann ich nur in die Tiefe mehr als 1.0 erreichen?

2. Falls ich die Zeile "D3D.SetRS(D3DRS_DITHERENABLE, TRUE);" einkommentiere sehe ich kein Dreieck mehr. Warum?

3. Falls ich die Kameramatrix einschalte, sehe ich ebenfalls kein Dreieck mehr. Was ist falsch, wenn die Kamera an der Stelle (0,0,0) (ist dies der
default, falls ich keine Kamera wähle?) steht und auf die Pos (0,0,0) oder (0,0,1) schaut?

4. Falls ich "D3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );" nicht aufgerufen habe, flackert das Bild ganz arg
und es ist nichts zu sehen. Wenn ich mir die Codes mit der Engine anschaue (Kapitel 3 Beispiel 2), wird dies auch nicht gemacht.

5. Kann mir jemand etwas zu den Texturkoordianten sagen? Mir ist nicht ganz klar, wie der Zusammenhang Texturkoordianten und Anbringung an das Dreieck ist.

Hoffentlich waren dies nicht zu viele Fragen.

Gruss
Daniel

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

2

24.10.2005, 20:14

zu 1.
nein, die koordinaten von vectoren können theoretisch unendlich groß sein.
kann sein, dass du normalen meinst, die sollten nur eine länge von 1 haben.

zu 2.
so weit ich weiß is dithering die technik, mit denen die farbe der pixel zwischen den vertizes bestimmt wird, wenn die ausgeschaltet ist sieht man nichts mehr. --> google benutzen

zu 3.
versteh ich irgendwie nich, was du meinst

zu 4.
wenn du clear nicht aufrufst, wird der backbuffer vor dem nächsten rendern nicht "sauber gemacht". dh du siehst auf dem bildschrim sämtliche speicher leichen aus dem bereich. da das weitestgehend zufällig ist, was da drin ist erkennt man nur noch rauschen
--> directX hilfe

zu 5.
ich finde das hat david wirklich sehr gut erklärt. und mir fällt keine erklärung ein, die hier noch reinpasst...
--> kapitel nochmal lesen


(edit: da war ein pfeil zuviel)
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...