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

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

1

04.02.2011, 23:42

Daten werden nicht richtig in die Datei geschrieben

Hi

Ich programmiere zur Zeit eine kleine Engine. Nun bin ich dran mit dem eigenen Modelformat. Ich habe dafür einen eigenen Formatkonverter geschrieben. Und in der Engine habe ich den Loader des Modelformates programmiert.

Doch nun werden die Daten falsch in die Datei geschrieben, ich weiss leider nicht wieso.

Hier ist ein Codeausschnitt des Formatkonverters:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Mit dem Schreiben beginnen
    m_File.write(reinterpret_cast<char*>(&m_NumMeshes), sizeof(unsigned int));

    for(unsigned int i = 0; i < m_NumMeshes; ++i)
    {
        m_File.write(reinterpret_cast<char*>(&m_ModelData.NumVertices[i]), sizeof(unsigned int));

        for(unsigned int v = 0; v < m_ModelData.NumVertices[i]; ++v)
        {
            m_File.write(reinterpret_cast<char*>(&m_Model[i].Vertices[v].posx), sizeof(float));
            m_File.write(reinterpret_cast<char*>(&m_Model[i].Vertices[v].posy), sizeof(float));
            m_File.write(reinterpret_cast<char*>(&m_Model[i].Vertices[v].posz), sizeof(float));
            m_File.write(reinterpret_cast<char*>(&m_Model[i].Vertices[v].normalx), sizeof(float));
            m_File.write(reinterpret_cast<char*>(&m_Model[i].Vertices[v].normaly), sizeof(float));
            m_File.write(reinterpret_cast<char*>(&m_Model[i].Vertices[v].normalz), sizeof(float));
            m_File.write(reinterpret_cast<char*>(&m_Model[i].Vertices[v].texx), sizeof(float));
            m_File.write(reinterpret_cast<char*>(&m_Model[i].Vertices[v].texy), sizeof(float));
        }
    }


Hier ist ein Codeausschnitt des Loadercodes für das Modelformat:

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
m_NumMeshes = 0;

    m_File.read(reinterpret_cast<char*>(&m_NumMeshes), sizeof(unsigned int));

    m_Buffer = new veSVertexBuffer[m_NumMeshes];

    for(unsigned int i = 0; i < m_NumMeshes; ++i)
    {
        m_NumVertices = 0;
        m_File.read(reinterpret_cast<char*>(&m_NumVertices), sizeof(unsigned int));
        TempModel.Vertices = new veModelVertex[m_NumVertices];
        m_Model.NumVertices.push_back(m_NumVertices);

        for(unsigned int v = 0; v < m_NumVertices; ++v)
        {
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].posx), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].posy), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].posz), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].normalx), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].normaly), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].normalz), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].tu), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].tv), sizeof(float));
        }

        m_ModelData.push_back(TempModel);
    }

    for(unsigned int i = 0; i < m_NumMeshes; ++i)
    {
        if(FAILED(hResult = d3ddev->CreateVertexBuffer(m_Model.NumVertices[i] * sizeof(veModelVertex),
                                                                    D3DUSAGE_WRITEONLY,
                                                                    ModelVertexFVF,
                                                                    D3DPOOL_MANAGED,
                                                                    &m_Buffer[i].pVertexBuffer,
                                                                    NULL)))
        {
            MessageBox(NULL, "Fehler beim Erzeugen des VertexBuffers", "Fehler aufgetreten",
                       MB_OK | MB_ICONEXCLAMATION);

            return false;
        }

        void * pData;
        m_Buffer[i].pVertexBuffer->Lock(0, 0, (VOID**)&pData, 0);
        memcpy(pData, m_ModelData[i].Vertices, sizeof(veModelVertex) * m_Model.NumVertices[i]);
        m_Buffer[i].pVertexBuffer->Unlock();
    }


Beim Auslesen der Datei wird der Vector NumVertices nur mit den Daten 3624 gefüllt. Diese Anzahl von Vertices entspricht der Anzahl der Vertices des ersten Meshes des Models.
Ich nehme an, dass das der Fehler ist, dass das Model nicht richtig angezeigt wird.

Hier noch ein Bild von dem gerndertem Model, welches nicht vollständig angezeigt wird. Es sollte eine Kugel darstellen.


(Link)


LG Patrick

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

04.02.2011, 23:46

Ich rate mal ganz keck ins Blaue und sag: Du hast vergessen deine Datei im Binärmodus zu öffnen.

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

3

04.02.2011, 23:58

Tatsächlich, ich habe die Datei mit ios:in geöffnet.

Doch wenn ich nun die Datei so öffne, wird nichts gerendert, kommt lediglich ein weisser Bildschirm.

C-/C++-Quelltext

1
m_File.open(Filename, ios::binary);


Die Datei beim Konverter habe ich zuvor ebenfalls mit ios:out geöffnet und dann hineingeschrieben. Das habe ich nun ebenfalls geändert, doch es funktioniert immer noch nicht, kommt ebenfalls noch ein weisser Bildschirm, warum?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

05.02.2011, 00:03

Machs mal mit

C-/C++-Quelltext

1
2
3
m_File.open(Filename, ios::in | ios::binary);
// bzw.
m_File.open(Filename, ios::out | ios::binary);

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

5

05.02.2011, 00:04

Habe ich ebenfalls bereits gemacht, geht leider immer noch nicht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

05.02.2011, 00:04

Dann schlag ich vor dass du mal den Debugger anwirfst und schaust wo genau es dich aufstellt ;)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

05.02.2011, 00:12

Nutz doch mal spasseshalber den << bzw >> Operator zum Lesen un Schreiben. Sprich statt "m_File.read(reinterpret_cast<char*>(&m_NumMeshes), sizeof(unsigned int));" sowas wie "m_File >> m_NumMeshes;" (übrigens kann man mehrere >> bzw. << "hintereinander" packen).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

8

05.02.2011, 00:15

Was kann falsch sein, wenn der Wert von m_NumVertices plötzlich auf 3270754304 steigt? Der Wert sollte jedoch 378 aufweisen.
Ok mache ich mal, wird dieser Code ebenfalls in einer Binären Datei angezeigt? mit m_File << "" << m_NumVertices << endl;?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

05.02.2011, 00:16

Ich geh mal davon aus dass du nun sowohl binär schreibst als auch liest!? Schau mal was in der Datei an der Stelle für ein Wert steht und überprüf ob dein Programm auch von der richtigen Stelle in der Datei liest.

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

10

05.02.2011, 00:18

Das muss ich jetzt mit m_File << "" << endl überprüfen oder? Ich kann ja schlecht binäre Buchstaben lesen.

Werbeanzeige