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

Anonymous

unregistriert

1

07.12.2008, 15:22

Überprüfung

Hallo,
zurzeit schreibe ich einen OBJ-Fileloader. Ist alles kein Problem, alles wird gut eingelesen. In den OBJ-Spezifikationen ist per Legende angegeben, dass die Texturekoordinaten folgendermaßen aufgebaut sind:
(Achtung, Pseudocode!)

Quellcode

1
vt vertexIndex1/textureIndex1 vertexIndex2/textureIndex2 vertexIndex3/textureIndex3


Normalerweise würde ich diese Daten mit fcsanf durchgehen und mir die Daten rauspicken, bzw.:

C-/C++-Quelltext

1
2
3
        fscanf(File, "%d/%d %d/%d %d/%d", &newFace.vertIndex[0], &newFace.coordIndex[0],
                                                   &newFace.vertIndex[1], &newFace.coordIndex[1],
                                                   &newFace.vertIndex[2], &newFace.coordIndex[2]);  


Das Problem ist jetzt, dass die Formatierung in anderen Modeldateien so aufgebaut ist:
(Achtung, Pseudocode!)

Quellcode

1
vt vertexIndex1//textureIndex1 vertexIndex2//textureIndex2 vertexIndex3//textureIndex3


Na, schon gefunden was anders ist? Richtig, hier ist ein doppel-Slash. Die Frage ist jetzt wie ich das am besten machen soll. Was ist da die eleganteste Lösung? Ich dachte da an eine Überprüfung, ob der char ein doppel-Slash beinhaltet. Einer ne Idee?

Danke im Voraus!

2

07.12.2008, 15:38

Programmierst du in C++? Wenn ja, solltest du std::stringstream verwenden. Dann kannst du auch den praktischen operator<< nutzen, um gezielt einzulesen.

Anonymous

unregistriert

3

07.12.2008, 15:44

Zitat


Programmierst du in C++?

Nä, ich debugge mit HTML!

Nee, ich wollte eigentlich keine Strings nehmen, mag die nicht so.

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

4

07.12.2008, 15:53

Wenn du kein C++ programmierst, könntest du dir noch folgendes überlegen:

C-/C++-Quelltext

1
2
3
4
fscanf(File, "%d%2[/]%d %d%2[/]%d %d%2[/]%d",
   &newFace.vertIndex[0], threeCharDummy, &newFace.coordIndex[0], 
   &newFace.vertIndex[1], threeCharDummy, &newFace.coordIndex[1],
   &newFace.vertIndex[2], threeCharDummy, &newFace.coordIndex[2]);


Zitat von »"Coders-Square"«

Nä, ich debugge mit HTML!

Das will ich sehen! Und btw. C++ hat viele Vorteile, solltest du dir echt mal überlegen.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

07.12.2008, 15:55

Zitat von »"Coders-Square"«


Nee, ich wollte eigentlich keine Strings nehmen, mag die nicht so.


Was magst du an denen nicht?
Im übrigen hat Nexus von strinstream gesprochen und das ist noch ein wenig etwas anderes.
Wobei ich eher zu ifstream geraten hätte. ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

07.12.2008, 16:21

Du könntest den entsprechenden Teil ja auch selbst auseinanderplücken. Zumal ich den Dateiinhalt sowieso komplett in den Speicher laden-, und dann von dort die Informationen holen würde.
@D13_Dreinig

7

07.12.2008, 16:23

boost::spirit ist bestimmt auch gut. Für obj Dateien braucht man zwar wahrscheinlich länger, spirit zu lernen, als die zu parsen, aber wenn man mal öfters Textdateien parsen will, ist das Ding bestimmt supi.
Lieber dumm fragen, als dumm bleiben!

Anonymous

unregistriert

8

07.12.2008, 17:10

Zitat

Das will ich sehen!


(Link)

:lol:

Spaß beiseite, ich hab jetzt den Faceparser geschrieben. Natürlich fehlen noch die FillInfos, aber das ist ja jetzt noch irrelevant. Hier mal der 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
void OBJ::ReadFaces()
{
    char *Line = {0};
    char ch   = {0};
    Face face={0};

    ch=fgetc(File);

    if(ObjectHasUV)
    {
        fscanf(File,"%d",&face.vertexIndex[0]);

        switch(ch)
        {
        case '/':
            fscanf(File,"%d/%d %d/%d %d/%d", &face.vertexIndex[0], &face.texcoordIndex[0],
                                             &face.vertexIndex[1], &face.texcoordIndex[1],
                                             &face.vertexIndex[2], &face.texcoordIndex[2]);
            fgets(Line,100,File);
            break;

        case '//':
            fscanf(File,"%d//%d %d//%d %d//%d", &face.vertexIndex[0], &face.texcoordIndex[0],
                                                &face.vertexIndex[1], &face.texcoordIndex[1],
                                                &face.vertexIndex[2], &face.texcoordIndex[2]);
            fgets(Line,100,File);
            break;

        default:
            fgets(Line,100,File);
            break;
        }

        fgets(Line,100,File);
    }
    else
    {
        fgets(Line,100,File);
    }

};

Kann man das so machen oder ist das totaler Mist? Testen kann ich's grad nicht, Renderer fehlt schliesslich.

Danke im Voraus!

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

9

07.12.2008, 17:59

Zitat von »"Coders-Square"«

Kann man das so machen oder ist das totaler Mist? Testen kann ich's grad nicht, Renderer fehlt schliesslich.

Danke im Voraus!


Ach. Schonmal was von nem Debugger gehört? Der Code macht für mich keinen Sinn, das dürftest du noch nicht mal durch nen Compiler kriegen, und selbst dann wird es böse crashen. Bisschen mehr Denken könnte helfen.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

10

07.12.2008, 18:25

Coders-Square

hast du dir mal den Beispiel-Code aus dem DX-SDK (MeshFromOBJ) angeschaut?

Werbeanzeige