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

16.11.2003, 13:47

Meine App will kein Triangle zeichnen :(

Hallo Leute!
Seit ein paar Tagen probier ich jetzt schon rum, aber meine App will einfach kein Polygon auf den Screen zeichnen. Ich hab schon alles mögliche versucht, aber der Code aus dem Buch klappt bei mir net, ebenso wenig wie der Code aus verschiedensten Tutorials; Alles was ich ab und zu bekomme ist n rotes rechteck dass die ganze haelfte des bildschirms einnimmt, oder eine rote linie wenn ich die clipping plane um den faktor 10 nach hinten verschiebe). Ich bekomme auch keine Errors, alle Funktionen liefern bei Test D3D_OK zurueck.
Vielleicht könnt ihr mir ja helfen endlich mein Polygon auf den Screen zu bekommen;

Hier mein Code (net lachen, bin amateur!):

Quellcode

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
//Init Scene Method
bool CApplication::InitScene()
{   
    HRESULT hResult;
 
    hResult = pD3DDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);

    //Deactivate LIGHTHING and CULLING, Activate DITHERING
    pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);
    pD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
    pD3DDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);

    fAspect = (float)(d3dpp.BackBufferWidth)/(float)(d3dpp.BackBufferHeight);
    
    //Creating Projection-Matrix
    tbMatrix mProjection = tbMatrixProjection(0, fAspect, 0.1f, 1000.0f);
    //Setting Projection-Matrix
    pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));
    
    //Speichere Dreieck
    aTriangleVertex[0].vPosition = tbVector3(0.0f,1.0f,10.0f);
    aTriangleVertex[1].vPosition = tbVector3(-1.0f,1.0f,10.0f);
    aTriangleVertex[2].vPosition = tbVector3(-1.0f,-1.0f,10.0f);
    aTriangleVertex[0].dwColor = (DWORD)(tbColor(1.0f,0.0f,0.0f));
    aTriangleVertex[1].dwColor = (DWORD)(tbColor(0.0f,1.0f,0.0f));
    aTriangleVertex[2].dwColor = (DWORD)(tbColor(0.0f,0.0f,1.0f));

    return true;
}


Quellcode

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
//Rendering Method
bool CApplication::Render()
{
    tbMatrix mRotation;
    tbMatrix mTranslation;
    tbMatrix mWorld;
    HRESULT  hResult;

    tbMatrixRotationY(TB_DEG_TO_RAD(90.0f));
    tbMatrixTranslation(tbVector3(0.0f,0.0f,80.0f));

    mWorld = mRotation * mTranslation;
    pD3DDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)(&mWorld));


    if(CheckD3DDevice())
    {
    pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER ,D3DCOLOR_XRGB(0,0,68),1.0f,0);
    pD3DDevice->BeginScene();
    
    hResult = pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,aTriangleVertex,sizeof(sVertex));

    pD3DDevice->EndScene();
    pD3DDevice->Present(NULL,NULL,NULL,NULL);
    }


    return true;
}


Quellcode

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
//GameLoop
bool CApplication::DoGameLoop()
{

    MSG Message;
    DWORD dwTime1;
    DWORD dwTime2;
    

    while(D3DStatus == true)
    {
     
     dwTime1 = timeGetTime();
     
     if(PeekMessage(&Message,NULL,0,0,PM_REMOVE))
     {
     TranslateMessage(&Message);
     DispatchMessage(&Message);
     }
     
     Move();
     Render();

     dwTime2 = timeGetTime();
     fNumSecsPassed = (float)(dwTime2-dwTime1) / 1000.0f;
   } 
    
    //Releasing Dx-Device 
    if(pD3DDevice != NULL)
    {
        pD3DDevice->Release();
    }
    //Rleasing Dx-Interface
    if(pD3D != NULL)
    {
        pD3D->Release();
    }


    return true;
}



wisst ihr was ich da falsch mache? Der Backbuffer wird ganz normal gecleared, aber Rendern tut er nix. Die Vertex-Struktur ist ein public member meiner Klasse.

please help :(

p.s. ich weiss das da einige sachen momentan net so ganz richtig eingestellt sind, mir gehts auch nur drum endlich mal n polygon auf meinem screen zu sehen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

16.11.2003, 13:56

Erstmal: Willkommen als 200. angemeldeter Benutzer in diesem Forum! :)
Zum Problem: Du erstellt keine Projektionsmatrix, das dürfte der Fehler sein!

3

16.11.2003, 14:01

mach ich doch in der InitScene-Method...oder hab ich da irgendwas vergessen oder falsch gemacht?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

16.11.2003, 14:08

Ja, Du gibst einen Blickfeld-Winkel von 0 an. Das wäre dann so, als ob Du durch ein Teleskop guckst, welches unendlich stark vergrößert. TB_PI / 3.0f ist ein guter Wert...

5

16.11.2003, 14:43

das wars leider auch nicht. Hab jetzt schon zig Tests gemacht; bei manchen Koordinaten tritt folgender Effekt auf:

Die ganze linke Bildschirmseite ist ein rotes Rechteck (Farbe des 1. vertex im array), das sich komischerweise bei mausbewegungen (windows-events) ausdehnt oder zusammenzieht. hmm, ich kann mir des absolut nicht erklären....

Woran könnte des den potentiell liegen? Ich probier jetzt schon seit Tagen und ausser dem rotem Rechteck hab ich noch nie was gesehen. Des kann doch nicht so schwer sein.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

16.11.2003, 14:45

Wie sieht denn die Vertexstruktur aus?

7

16.11.2003, 14:50

die sieht folgendermaßen aus:

Quellcode

1
2
3
4
5
typedef struct
{
    tbVector3 vPosition;
    DWORD     dwColor;
}sVertex;


Ich hab eigentlich alles aus deinem Buch übernommen, ausser der MessageLoop.

p.s. hab jetzt alle konstanten Werte dem Buch angepasst->tortzdem immer wieder der gleiche Fehler. Kann es damit zusammenhängen, dass mein Fenster nicht richtig funktioniert? Ich benutze nämlich nicht InitWindow oder tbInitD3D;

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

16.11.2003, 14:56

Re: Meine App will kein Triangle zeichnen :(

Zitat von »"Pirat!"«

tbMatrix mRotation;
tbMatrix mTranslation;
tbMatrix mWorld;
HRESULT hResult;

tbMatrixRotationY(TB_DEG_TO_RAD(90.0f));
tbMatrixTranslation(tbVector3(0.0f,0.0f,80.0f));

mWorld = mRotation * mTranslation;

Die Matrizen "mRotation" und "mTranslation" füllst Du garnicht aus, aber verwendest sie später, um die Matrix "mWorld" zu berechnen. Da Du sie nicht setzt, sind sie mit Datenmüll gefüllt.
Außerdem würde die Rotationsmatrix bewirken, dass das Dreieck stets um 90° gedreht ist, dann würdest Du von der seite draufgucken und eh nur eine dünne Linie oder garnichts sehen. Wenn dann musst Du die Rotation von der Zeit abhängig machen.

9

16.11.2003, 15:03

Das mit den Matrizen könnte es sein. Hab allerdings auch nur nen roten Strich bekommen, als ich z.b. 60° eingesetzt hab, oder 1°.

Naja, jedenfalls danke für die Hilfe, werd mal weiter rumprobieren.

p.s. ich depp!

p.p.s THX,THX und nochmal THX!

aber da haett ich noch ne anmerkung zum buch:
auf seite 122 stellst du deine Render-funktion vor. Doch deine Matrix-Klasse akzeptiert keine 2 params( 2ter param ist pointer auf matrix), sondern liefert die Matrix gleich zurück. Nur ein marginaler Fehler, aber ich dacht ich erwähns mal der Perfektion wegen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

16.11.2003, 15:06

Zitat von »"Pirat!"«

Das mit den Matrizen könnte es sein. Hab allerdings auch nur nen roten Strich bekommen, als ich z.b. 60° eingesetzt hab, oder 1°.

Klar - Du rufst zwar die Funktionen tbMatrixTranslation und tbMatrixRotationY auf, aber Du speicherst ihren Rückgabewert ja überhaupt nicht. Dann ist es auch völlig egal, was Du ihnen als Parameter angibst, da Du die zurückgelieferten Matrizen ja garnicht verwendest.

Es muss natürlich heißen:
mTranslation = tbMatrixTranslation(...);
mRotation = tbMatrixRotationY(...);

Übrigens solltest Du die z-Koordinaten der Vertizes auf null setzen (denn sonst funktioniert die Rotation nicht richtig), und 80 ist bei der Translation sicher zu viel, dann wäre das Dreieck viel zu weit weg!

Also:
1.) Matrizenvariablen ausfüllen!
2.) Vertex-z-Koordinaten des Dreiecks auf null setzen!
3.) Aus der 80 eine 10 oder so machen!

Werbeanzeige