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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

07.06.2012, 17:59

Eigenes Modellformat - Loader

Hallo, ich mal wieder,

ich bastel gerade an einem kleinen eigenen binären 3D Modellformat, da ply nicht das kann was ich brauche und es ASCII ist.
Jetzt habe ich immerhin einen Konverter der korrekt von ply nach "bbm" (Name für mein Format) konvertieren kann, das heißt es werden die Daten (Vertices, TextKoords, Normalen und Indices) ausgelesen und im bbm abgespeichert. Vor den Daten hängt noch ein Header der wie folgt aussieht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
struct bbmHeader{
    char signatur[3]; // "bbm"
    char version; // 1
    unsigned int dataCount; // für Vertices, TexKoords, Normalen (immer gleiche Anzahl)
    unsigned int indicesCount; // für Indices
    char boneUse; // 0/1 | noch nicht eingebaut
    char boneCount; // pro vertex, sollte > 0 sein wenn boneUse = 1 | noch nicht eingebaut
};


Jetzt versuche ich die Daten wieder auszulesen (vertex, texCoord structs):

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
bool bbmFile::load(string path){
    ifstream file(path);

    if(!file.good()){
        return false;
    }

    // Header
    file.read(reinterpret_cast<char*>(&m_header), sizeof(bbmHeader));
    
    if(m_header.signatur[0] != 'b' || m_header.signatur[1] != 'b' || m_header.signatur[2] != 'm' || m_header.version != 1){
        return false;
    }

    // Daten
    m_vertices.resize(m_header.dataCount);
    m_texCoords.resize(m_header.dataCount);
    m_normals.resize(m_header.dataCount);
    m_indices.resize(m_header.indicesCount);

    file.read(reinterpret_cast<char*>(&m_vertices[0]), sizeof(vertex)*m_header.dataCount);
    file.read(reinterpret_cast<char*>(&m_texCoords[0]), sizeof(texCoord)*m_header.dataCount);
    file.read(reinterpret_cast<char*>(&m_normals[0]), sizeof(vertex)*m_header.dataCount);
    file.read(reinterpret_cast<char*>(&m_indices[0]), sizeof(unsigned int)*m_header.indicesCount);

    file.close();
    
    return true;
}


Und stelle fest das die letzten paar Indices fehlen (ich habe das testweise ausgeben lassen)! Im ply file (die 3 am Anfang ignorieren):

Quellcode

1
2
3
4
5
6
3 0 1 2
3 3 4 5
3 6 7 8
3 9 10 11
3 12 13 14
3 15 0 2


Und in der Ausgabe:

Quellcode

1
2
3
4
5
6
0 1 2
3 4 5
6 7 8
9 10 11
12 0 0
0 0 0


Die Daten in der Datei stimmen, das habe ich mit einem Hex Editor geprüft (letzten paar Werte mit ply Datei verglichen). Daraus folgt das es auch nicht am ply loader liegen kann (den ich sowieso schon ewig benutze und funktioniert).
Es werden auch die restlichen Daten komplett eingelesen, also in m_vertices, m_normals, m_texCoords stehen die korrekten Werte. Der "indicesCount" im Header passt auch zu dem im ply file.
Also: wo liegt der Fehler? Ich seh ihn nicht...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

07.06.2012, 18:54

Tja...wir müssten unsere Glaskugeln fragen, aber du könntest den Debugger anschmeißen :) . Aber ich würde ja dazu raten die Datei auch binär zu lesen und schreiben, wenn es sich denn um eine binäre Datei handeln soll.
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.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

07.06.2012, 18:58

Richtig, wenn du konstruktive Hilfe willst wäre die Datei sinnvoll, oder ein Hexdump davon...
@D13_Dreinig

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

07.06.2012, 19:07

Oh mir ist gar nicht aufgefallen das ich nicht binär einlese... danke Problem behoben :D
Da haben wir mal wieder den wtf Moment...

Aber nur zur Vervollständigung für diesen Thread (einfache Pyramide):

Quellcode

1
62626D011000000012000000000000000000803F0000803F000080BF0000803F000080BF000080BF000080BF000080BF000080BF0000803F0000803F000080BF00000080000000800000803F0000803F000080BF000080BF0000803F000080BF000080BF00000080000000800000803F000080BF000080BF000080BF000080BF000080BF000080BF00000080000000800000803F000080BF0000803F000080BF00000080000000800000803F0000803F0000803F000080BF000080BF0000803F000080BF000080BF0000803F000080BF552E243FBC54B43E0BECB93E4A7EB43E9815BA3E8677213F552E243FBC54B43EF27A003F8046293D0BECB93E4A7EB43EBB7D363EF69A563F2FBE003F7C0D713F9815BA3E8677213F9815BA3E8677213F2FBE003F7C0D713F1C43243FAE62213F2FBE003F7C0D713F79CD533F666A563F1C43243FAE62213F1C43243FAE62213F0000000000000000000080BF0000000000000000000080BF0000000000000000000080BF2BF9643F000000003CF9E43E2BF9643F000000003CF9E43E2BF9643F000000003CF9E43E000000802BF964BF3CF9E43E000000802BF964BF3CF9E43E000000802BF964BF3CF9E43E2BF964BF000000003CF9E43E2BF964BF000000003CF9E43E2BF964BF000000003CF9E43E000000002BF9643F3CF9E43E000000002BF9643F3CF9E43E000000002BF9643F3CF9E43E0000000000000000000080BF000000000100000002000000030000000400000005000000060000000700000008000000090000000A0000000B0000000C0000000D0000000E0000000F0000000000000002000000


[EDIT]

Ok das sieht extrem bescheiden aus.


(Link)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

07.06.2012, 19:12

Aber nur zur Vervollständigung für diesen Thread (einfache Pyramide):


In der Form hilft das sicher niemandem...

Edit: ok, schon besser! ;)
@D13_Dreinig

Werbeanzeige