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

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

1

18.06.2013, 20:07

Das erste Dreieck

Bin in Sachen 3D Grafik noch relativ neu und gerade im Kapitel wo das erste Dreieck erstellt wird.
Ich habe den Code aus dem Buch abgeschrieben und kompiliert das Dreieck wird zwar gerendert aber es rotiert vollkommen falsch (und das auch noch zu schnell).
Ich habe bereits nach dem Fehler gesucht bin jedoch wahrscheinlich zu blöd ihn zu finden.

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
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include <Windows.h>
#include <TriBase.h>

#include "Direct3DEnum.h"
#include "InitDirect3D.h"
#include "InitWindow.h"

#include "resource.h"

struct SVertex
{
    tbVector3 vPosition;
    DWORD dwColor;
};

SDirect3DParameters g_Direct3DParameters;
float g_fTime = 0.0f;
SVertex g_aTriangleVertex[3];


tbResult InitScene ()
{
HRESULT hResult;
float fAspect;

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

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

fAspect = (float)(g_Direct3DParameters.VideoMode.Width)
        / (float)(g_Direct3DParameters.VideoMode.Height);

tbMatrix mProjection = tbMatrixProjection (TB_DEG_TO_RAD(90.0f), fAspect, 0.1f, 100.0f);

g_pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));


g_aTriangleVertex[0].vPosition = tbVector3(0.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[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);

return TB_OK;
}

tbResult Render(float fNumSecsPassed)
{
    HRESULT hResult;

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

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

    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);
    }

    g_pD3DDevice->BeginScene();

    if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, g_aTriangleVertex, sizeof(SVertex))))
    {
    TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
    }

    g_pD3DDevice->EndScene();

    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

    return TB_OK;
}


tbResult ExitApplication()
{
    


    
    ExitDirect3D();
    ExitWindow();

    
    tbExit();

    return TB_OK;
}



tbResult InitApplication()
{
    tbResult Result;

    
    tbInit();

    
    Result = GetDirect3DParameters(&g_Direct3DParameters);
    if(Result == TB_ERROR)
    {
        
        MessageBox(NULL, "Fehler beim Abzählen!", "Fehler",
                   MB_OK | MB_ICONEXCLAMATION);
        return TB_ERROR;
    }
    else if(Result == TB_CANCELED)
    {
        
        return TB_CANCELED;
    }

    
    if(InitWindow(g_Direct3DParameters.VideoMode.Width,
                  g_Direct3DParameters.VideoMode.Height,
                  "Beispielprogramm Nr. 3: Das erste Dreieck",
                  LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1))))
    {
        
        MessageBox(NULL, "Fehler beim Erstellen des Fensters!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        return TB_ERROR;
    }

    
    if(InitDirect3D(&g_Direct3DParameters,
                    g_hWindow))
    {
        
        MessageBox(g_hWindow, "Fehler beim Initialisieren von Direct3D!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        ExitApplication();
        return TB_ERROR;
    }

    
    if(InitScene())
    {
        
        MessageBox(g_hWindow, "Fehler beim Initialisieren der Szene!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        ExitApplication();
        return TB_ERROR;
    }


    return TB_OK;
}

tbResult Move (float fNumSecsPassed)
{

g_fTime += fNumSecsPassed;

return TB_OK;
}

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCmdLine,
                   int iShowCmd)
{

tbResult Result;
    Result = InitApplication();

    if(Result == TB_CANCELED ) return 0;
    else if( Result )
    {
    MessageBox (NULL, "Fehler beim initialisieren!", "Fehler:", MB_OK | MB_ICONEXCLAMATION );

    return 1;
    }

    tbDoMessageLoop (Move, Render);

    ExitApplication ();

    return 0;
}


Zur Info das Dreieck sollte auf der Y-Achse rotieren.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Swoerm« (19.06.2013, 07:14)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

19.06.2013, 11:32

Es ist für uns ziemlich unspaßig uns durch den Code zu wühlen. Wichtig ist, dass du dir die wichtigen Stellen anguckst. Das ist in diesem Fall vermutlich nur die Stelle für die Rotation. Die Rotationsgeschwindigkeit sollte ja vermutlich irgendwie von der Zeit abhängig sein. Ist dies nicht der Fall wäre es die erste Fehlerquelle. Die Rotationsrichtung wird ja vermutlich in einer Matrix für die Rotation festgelegt. Wenn um eine falsche Achse gedreht wird ist die Matrix falsch. Wichtig ist es den Code nicht abzuschreiben sondern möglichst wirklich alles nachzuvollziehen. Am besten wäre es, wenn du dir das Kapitel anguckst und hinterher selbst das Programm schreiben könntest. Das kann beim lernen natürlich ziemlich zeitintensiv sein, dass verstehe ich. Aber vernünftig verstehen solltest du schon alles.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

3

19.06.2013, 13:49

Quellcode

1
tbMatrix mRotation(tbMatrixRotation(TB_DEG_TO_RAD(g_fTime * 90.0f)));

soll wohl

Quellcode

1
tbMatrix mRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f)));


Ist aber zeitabhängig.

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

4

19.06.2013, 15:06

Vielen vielen dank! :thumbsup:
Endlich funktioniert alles so wie soll und seltsamer Weise klappt das mit der zeit jetzt auch.

@Schorsch
Ich kann gut nachvollziehen das eine solchen Code zu durchwühlen unspaßig ist doch ich habe diesen Fehler schon längere Zeit gesucht und wollte mal jemand erfahreneren drüber schauen lassen.

Ich kann mich nur noch mal bedanken. :thumbsup:

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

19.06.2013, 17:47

Ist schon richtig. Ich habe mir den Code zum Beispiel angeguckt, habe halt gesehen, dass da irgendeine Matrix erzeugt wird aber nichts genaueres. Ich hätte jetzt die TB Engine laden müssen und da im Source gucken müssen was für Funktionen für Matrizen es gibt und was diese tun. Hier war es ja einfach nur die falsche Funktion. Deswegen ist es so wichtig, dass man nicht blind tippt sondern genau guckt welche Funktionen es gibt und was diese tun. Das ist sicherlich nicht immer einfach, gehört hinterher aber dazu. Wenn du die Mathematik dahinter kannst dann kannst du dir den Code von solchen Funktionen ja auch angucken und selbst sehen was in dieser Funktion passiert.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige