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

Maviee

Frischling

  • »Maviee« ist der Autor dieses Themas

Beiträge: 2

Wohnort: Hannover

Beruf: Programmierer

  • Private Nachricht senden

1

07.01.2007, 19:24

Übungsaufgabe 2.5.6 Nr.2

Hallo,

ich bin jetzt bei der obigen Übungsaufgabe angekommen, in der ich anstelle des Dreiecks ein Viereck rotieren lassen soll. Soweit so leicht dachte ich mir, denn mein Dreieck rotiert munter vor sich hin.

Ich habe daher Anstelle von 3 nun 4 Veritizes genommen, die Koordinaten entsprechend verteilt und den D3DPriimitiveType auf D3DPT_TRIANGLESTRIP gestellt.

Starte ich nun das kleine Programm sehe ich trotzdem nur ein Dreieck. Stelle ich den PrimitiveCount auf 2 werden zwar alle Punkte angezeigt, aber es fehlt eine Verbindung vom 4. zum 1. Punkt.

Hier mal mein Code:

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
tbResult InitScene()
{
    HRESULT hResult;

    if (FAILED(hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE)))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    }

    // RenderStates setzen

    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);

    // Angaben für die Projektionsmatrix

    float fAspectRatio = g_Direct3DParameters.VideoMode.Width / g_Direct3DParameters.VideoMode.Height;
    tbMatrix mProjektionsMatrix = tbMatrixProjection(TB_DEG_TO_RAD(90.0f), fAspectRatio, 0.1f, 100.0f);
    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjektionsMatrix));

    // Das Dreieck definieren

    g_aTriangleVertex[0].vPosition = tbVector3(-1.0f, 1.0f, 0.0f);
    g_aTriangleVertex[1].vPosition = tbVector3(1.0f, 1.0f, 0.0f);
    g_aTriangleVertex[2].vPosition = tbVector3(1.0f, -1.0f, 0.0f);
    g_aTriangleVertex[3].vPosition = tbVector3(-1.0f, -1.0f, 0.0f);
    g_aTriangleVertex[0].dwColor   = tbColor(1.0f, 0.0f, 0.0f);
    g_aTriangleVertex[1].dwColor   = tbColor(0.0f, 1.0f, 0.0f);
    g_aTriangleVertex[2].dwColor   = tbColor(0.0f, 0.0f, 1.0f);
    g_aTriangleVertex[3].dwColor   = tbColor(1.0f, 1.0f, 1.0f);

    return TB_OK;
}

tbResult Render(float fNumSecsPassed)
{   
    HRESULT hResult;

    tbMatrix mRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f)));
    tbMatrix mTranslation(tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f)));

    // Multiplikation von Rotations- mit Translationsmatrix

    tbMatrix mWorld (mRotation * mTranslation);

    // Einsetzen der Matrix in die Weltmatrix

    g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld)); 

    // Den Bildbuffer und den Z-Buffer leeren

    if (FAILED(hResult =g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,63), 1.0f, 0)))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    // Zeichnen des Dreiecks

    g_pD3DDevice->BeginScene();
    
    if (FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 1, g_aTriangleVertex, sizeof(SVertex))))
    {
        TB_ERROR_DIRECTX("g_pD3DDevice->DrawIndexedPrimitiveUP", hResult, TB_STOP);
    }
    
    g_pD3DDevice->EndScene();
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL); 

    return TB_OK;
}


Ich hab wirklich nicht so die Ahnung, was ich da jetzt noch falsch mache.
Bin für Antworten sehr dankbar :)

Gruß
Mav

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

07.01.2007, 19:30

Überleg nochmal, wie der Trianglestrip arbeitet.

1. g_aTriangleVertex[0].vPosition = tbVector3(-1.0f, 1.0f, 0.0f);
2. g_aTriangleVertex[1].vPosition = tbVector3(1.0f, 1.0f, 0.0f);
3. g_aTriangleVertex[2].vPosition = tbVector3(1.0f, -1.0f, 0.0f);
4. g_aTriangleVertex[3].vPosition = tbVector3(-1.0f, -1.0f, 0.0f);

Zeichnet die Dreiecke
1. 2. 3.
2. 3. 4.

klar, dass es keine Verbindung von 1 zu 4 gibt ;)

Maviee

Frischling

  • »Maviee« ist der Autor dieses Themas

Beiträge: 2

Wohnort: Hannover

Beruf: Programmierer

  • Private Nachricht senden

3

07.01.2007, 19:50

Oh man .... Du hast vollkommen recht. Habe Vertex 3 + 4 vertauscht, PrimitiveCount auf 2 und schon gehts. Da hätte ich auch selber drauf kommen können.

Danke für die super schnelle Hilfe :)

Strike

Frischling

Beiträge: 36

Wohnort: Wien 1200 und Techelsberg 9212

Beruf: Junior Software-Entwickler & Software Testing

  • Private Nachricht senden

4

31.01.2014, 22:07

Zitat

Zeichnet die Dreiecke

1. 2. 3.

2. 3. 4.
Wie soll der Aufruf dann ausschaun?

C-/C++-Quelltext

1
2
3
4
5
// Nun das Dreieck zeichnen
    if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,  // Dreiecksliste
                                                    2,                  // 1 Dreieck
                                                      g_aTriangleVertex,    // Vertexdaten
                                                      sizeof(SVertex))))    // Vertexgröße

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Strike« (02.02.2014, 00:40)


Werbeanzeige