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

07.11.2009, 19:04

Modele werden nicht richtig angezeigt

Hallo, zusammen.
Ich habe mit Blender einen ganz normalen, einfachen Würfel erstellt und
ihn dann im format 3ds exportiert. Dann mit dem ModelConverter in das
Format tbm umgewandelt.
Aber in meiner Anwendung wird nur ein verzerrtes Bild angezeigt, auf dem ein Teil aus dem Blender-Editor zu sehen ist und sonst nur Bildstörungen.

mfg

2

07.11.2009, 19:11

Ein Wenig mehr infos wären ganz gut.
Code der wichtigen Stellen?
Screenshot ?

evtl. Das Tbm mal online stellen, um zu sehen, obs bei anderen Funktioniert.

Soweit ich weiß, funkt der Blender 3ds Exporter normalerweise, wenns nicht um Textur(koordinaten) geht.

3

08.11.2009, 01:03

Okay. Dann sind hier die weiteren Infos.
Modell redern:

C-/C++-Quelltext

1
g_pModel->Render();

Modell laden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
    g_pModel = new tbModel;
    if(g_pModel->Init("model.tbm"))
    {
        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Laden!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

Hier hab ich mal den Screenshot hochgeladen:
http://www.bilder-upload.eu/show.php?file=BfuUhn8qYHFidWu.jpg
Und hier die Modell-Datei:
http://www.fileuploadx.de/547835

4

08.11.2009, 08:52

Also bei mir Funktioniert es einwandfrei.

Mit Modell rendern hatte ich eigentlich die ganze Render-Funktion gemeint. ;)

Sicher, dass du alle Matrizen gesetzt hast, und die Present-Parameters stimmen ?

- Probiers mal mit Referenz-Rasterizer
- Schalt mal Direct3D in den Debug-Modus
sprich

C-/C++-Quelltext

1
#define D3D_DEBUG_INFO

irgendwo reinschreiben.

Die Debug libs linken.
Und die cpl.exe bei dir im DirectX SDK ordner Öffnen und oben rechts auf Use debug version klicken. (Nacher wieder zurückstellen, sonst viel spass beim Zeitlupe Zocken).
Jetzt kannst du die Ganzen Warnungen, Fehler und infos Lesen, die bei dir im Ausgabefenster kommen.

5

08.11.2009, 09:16

Hmm...in meinem ganzen DirectX3 SDK Ordner finde ich keine
Datei, die "cpl.exe" heißt.
Und hier die ganze Render-Funktion:

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
tbResult RenderProc(float fNumSecsPassed)
{
    tbMatrix    mProjection;
    tbMatrix    mCamera;
    tbMatrix    mWorld;
    tbVector3   vCameraDir;
    D3DLIGHT9   Light;


    // Z-Buffer leeren und die Szene beginnen

    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0, 1.0f, 0);
    D3D->BeginScene();

    // Projektionsmatrix erstellen und einsetzen

    mProjection = tbMatrixProjection(g_fFOV, D3D.GetAspect(), 0.1f, 300.0f);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);

    // Kameramatrix erstellen und einsetzen

    vCameraDir = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));
    mCamera = tbMatrixCamera(g_vCameraPos, g_vCameraPos + vCameraDir);
    D3D.SetTransform(D3DTS_VIEW, mCamera);

    // -----------------------------------------------------------------    


    // ------------------------------------------------------------------


    // Ein Richtungslicht erstellen mit der Richtung der Kamera

    ZeroMemory(&Light, sizeof(D3DLIGHT9));
    Light.Type = D3DLIGHT_DIRECTIONAL;
    Light.Diffuse = tbColor(0.5f, 0.5f, 0.5f);
    Light.Ambient = tbColor(0.5f, 0.5f, 0.5f);
    Light.Specular = tbColor(0.5f, 0.5f, 0.5f);
    Light.Direction = vCameraDir;
    D3D->SetLight(0, &Light);
    D3D->LightEnable(0, TRUE);

    // Linearer schwarzer Nebel!

    D3D.SetRS(D3DRS_FOGENABLE,      TRUE);
    D3D.SetRS(D3DRS_FOGVERTEXMODE,  D3DFOG_LINEAR);
    D3D.SetRS(D3DRS_RANGEFOGENABLE, TRUE);
    D3D.SetRS(D3DRS_FOGCOLOR,       0);
    D3D.SetRSF(D3DRS_FOGSTART,      100.0f);
    D3D.SetRSF(D3DRS_FOGEND,        350.0f);

    // Weltmatrix zurücksetzen

    D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity());

    // Das Modell rendern

    g_pModel->Render();

    // Kein Nebel mehr!

    D3D.SetRS(D3DRS_FOGENABLE, FALSE);

    // ------------------------------------------------------------------


    // Szene beenden

    D3D->EndScene();

    return TB_OK;
}

6

08.11.2009, 11:09

Bei Clear noch D3DCLEAR_TARGET dazu schadet nichts

Welchen Wert hat denn dein FOV?
wenn es nur auf 90.0f ist, musst du bei tbMatrixProjection
TB_DEG_TO_RAD(g_fFOV) angeben.

7

08.11.2009, 18:19

Soo...Ich hab jetzt das Flag D3DCLEAR_TARGET-Flag noch hinzugefügt
und ich hab g_fFov direkt so deklariert:

C-/C++-Quelltext

1
float   g_fFOV = TB_DEG_TO_RAD(90.0f);

Und jetzt ist alles schwarz, wenn ich es kompiliere.

8

08.11.2009, 18:26

Poste mal den ganzen Code.

9

08.11.2009, 18:29

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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <TriBase.h>
#include "resource.h"

// ******************************************************************


#define D3D_DEBUG_INFO 
// ******************************************************************

// Globale Variablen

tbConfig                g_Config;                       // Konfigurationsstruktur

tbModel*                g_pModel = NULL;            // Modell der Stadt

tbVector3               g_vCameraPos;                   // Kameraposition

float                   g_fCameraRot;                   // Rotation der Kamera

float                   g_fCameraUpDown;                // Schaut die Kamera hoch oder runter?

float                   g_fFOV = TB_DEG_TO_RAD(90.0f);  // Sichtfeld

float                   g_fTime = 0.0f;                 // Globaler Zeitzähler


// ******************************************************************

// Die Move-Funktion

tbResult MoveProc(float fNumSecsPassed)
{
    tbVector3 vCameraDir;

    // Den Zeitzähler aktualisieren

    g_fTime += fNumSecsPassed;

    // Tastatursteuerung...

    vCameraDir = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));

    if(GetAsyncKeyState(VK_LEFT))       g_fCameraRot -= 1.0f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_RIGHT))      g_fCameraRot += 1.0f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_UP))         g_fCameraUpDown -= 1.0f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_DOWN))       g_fCameraUpDown += 1.0f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_ADD))        g_vCameraPos += vCameraDir * 25.0f * fNumSecsPassed;
    if(GetAsyncKeyState(VK_SUBTRACT))   g_vCameraPos -= vCameraDir * 25.0f * fNumSecsPassed;

    // Die Tasten "Bild auf" und "Bild ab" verändern das Sichtfeld.

    // So kann man in das Bild "hineinzoomen", mit 15 Grad pro Sekunde.

    if(GetAsyncKeyState(VK_PRIOR)) g_fFOV -= TB_DEG_TO_RAD(15.0f) * fNumSecsPassed;
    if(GetAsyncKeyState(VK_NEXT)) g_fFOV += TB_DEG_TO_RAD(15.0f) * fNumSecsPassed;

    // Das Sichtfeld darf 180° und 0° nicht erreichen.

    if(g_fFOV >= TB_DEG_TO_RAD(180.0f)) g_fFOV = TB_DEG_TO_RAD(179.9f);
    else if(g_fFOV <= TB_DEG_TO_RAD(0.0f)) g_fFOV = TB_DEG_TO_RAD(0.1f);

    return TB_OK;
}

// ******************************************************************

// Die Render-Funktion

tbResult RenderProc(float fNumSecsPassed)
{
    tbMatrix    mProjection;
    tbMatrix    mCamera;
    tbMatrix    mWorld;
    tbVector3   vCameraDir;
    D3DLIGHT9   Light;


    // Z-Buffer leeren und die Szene beginnen

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

    // Projektionsmatrix erstellen und einsetzen

    mProjection = tbMatrixProjection(g_fFOV, D3D.GetAspect(), 0.1f, 300.0f);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);

    // Kameramatrix erstellen und einsetzen

    vCameraDir = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));
    mCamera = tbMatrixCamera(g_vCameraPos, g_vCameraPos + vCameraDir);
    D3D.SetTransform(D3DTS_VIEW, mCamera);

    // -----------------------------------------------------------------    


    // ------------------------------------------------------------------


    // Ein Richtungslicht erstellen mit der Richtung der Kamera

    ZeroMemory(&Light, sizeof(D3DLIGHT9));
    Light.Type = D3DLIGHT_DIRECTIONAL;
    Light.Diffuse = tbColor(0.5f, 0.5f, 0.5f);
    Light.Ambient = tbColor(0.5f, 0.5f, 0.5f);
    Light.Specular = tbColor(0.5f, 0.5f, 0.5f);
    Light.Direction = vCameraDir;
    D3D->SetLight(0, &Light);
    D3D->LightEnable(0, TRUE);

    // Linearer schwarzer Nebel!

    D3D.SetRS(D3DRS_FOGENABLE,      TRUE);
    D3D.SetRS(D3DRS_FOGVERTEXMODE,  D3DFOG_LINEAR);
    D3D.SetRS(D3DRS_RANGEFOGENABLE, TRUE);
    D3D.SetRS(D3DRS_FOGCOLOR,       0);
    D3D.SetRSF(D3DRS_FOGSTART,      100.0f);
    D3D.SetRSF(D3DRS_FOGEND,        350.0f);

    // Weltmatrix zurücksetzen

    D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity());

    // Das Modell rendern

    g_pModel->Render();

    // Kein Nebel mehr!

    D3D.SetRS(D3DRS_FOGENABLE, FALSE);

    // ------------------------------------------------------------------


    // Szene beenden

    D3D->EndScene();

    return TB_OK;
}

// ******************************************************************


// Aufräumen

tbResult CleanUp()
{
    // Alles löschen

    TB_SAFE_DELETE(g_pModel);
    tbDirect3D::Instance().Exit();
    tbTextureManager::Instance().Exit();

    // Die TriBase-Engine herunterfahren

    tbExit();

    return TB_OK;
}

// ******************************************************************

// Windows-Hauptfunktion

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCommandLine,
                   int iShowCommand)
{
    // TriBase-Engine initialisieren

    tbInit();

    // Konfiguration abfragen

    tbResult r;
    if(r = tbDoConfigDialog(&g_Config))
    {
        if(r == TB_CANCELED) return 0;
        else
        {
            // Fehler!

            MessageBox(NULL, "Fehler im Konfigurationsdialog!", "Fehler",
                       MB_OK | MB_ICONEXCLAMATION);
            return 1;
        }
    }

    // Direct3D initialisieren

    if(tbDirect3D::Instance().Init(&g_Config,
                                   "Beispielprogramm Nr. 2: Modelle",
                                   NULL,
                                   LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1))))
    {
        // Fehler!

        MessageBox(NULL, "Fehler bei der Direct3D-Initialisierung!", "Fehler",
                   MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Den Texturmanager initialisieren

    if(tbTextureManager::Instance().Init())
    {
        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Initialisieren des Texturmanagers!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    g_pModel = new tbModel;
    if(g_pModel->Init("model.tbm"))
    {
        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Laden!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Kamera initialisieren

    g_vCameraPos = tbVector3(0.0f, 10.0f, 0.0f);
    g_fCameraRot = 0.0f;
    g_fCameraUpDown = 0.0f;

    // Nachrichtenschleife betreten

    if(tbDoMessageLoop(MoveProc, RenderProc))
    {
        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Zeichnen!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Aufräumen

    CleanUp();

    return 0;
}

10

08.11.2009, 18:56

Sieht eigentlich soweit ganz gut aus.

- Probier mal, wenn du den Nebel weglässt.
- Tu mal das Ganze Projekt rebuilden. Hilft manchmal auch.

Werbeanzeige