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

Phili

unregistriert

1

21.05.2006, 20:36

Prob mit Konverter

Ich hab ein Prob beim Konvertieren von .x zu meinem eigenen Format.

Ich poste einfach mal den gesamten Quellcode(der Funtioniert übrigens Fehlerfrei)

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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
#include <fstream>
#include <iostream>
#include <string>
using namespace std;


void XzuA(char a[100], char b[100])
{
    cout<<"Starte Konvertierung "<<a<<" zu "<<b<<endl;

    char str[1000];

    ifstream ifs(a);
    ofstream ofs(b);

    cout<<"\tDateien geoeffnet"<<endl;
    cout<<"\tStarte Konvertierung"<<endl;

    if(ifs.fail()||ofs.fail())
        cout<<"\tFehler beim oeffnen"<<endl;
    while(ifs.fail()!=1)
    {
        ifs>>str;
        for(int i = 0; i < 1000; i++)
        {
            if(str[i]==',')str[i]=' ';
            if(str[i]==';')str[i]=' ';
        }
        ofs<<str<<endl;
    }
    cout<<"\tKonvertierung abgeschlossen"<<endl;
    ifs.close();
    ofs.close();
    cout<<"\tDateien geschlossen"<<endl<<endl;
}

void AzuPH(char aa[100], char bb[100])
{
    cout<<"Starte Konvertierung "<<aa<<" zu "<<bb<<endl;

    string str;
    float Pos[3][20000]; int PosMenge=0;
    float Nor[3][20000]; int NorMenge=0;
    float Tex[2][20000]; int TexMenge=0;
    float vec[3][20000];
    int a; int b; 
    int Index1;
    int Index2;
    int Index3;
    int Index4;

    ifstream ifs(aa);
    ofstream ofs(bb);

    cout<<"\tDateien geoeffnet"<<endl;
    cout<<"\tStarte Konvertierung"<<endl;

    while(!ifs.fail())
    {
        ifs>>str;
        if(str=="Mesh")
        {
            cout<<"\t\tneues Mesh"<<endl;
            ifs>>str;
            if(str!="{")
            {
                cout<<"\t\t...mit dem Namen "<<str<<endl;
                ifs>>str;
            }
            ifs>>a;
            cout<<"\t\t...mit "<<a<<" Vertices"<<endl;
            for(int i = 0; i < a; i++)
            {
                ifs>>vec[0][i];
                ifs>>vec[1][i];
                ifs>>vec[2][i];
            }
            ifs>>a;
            cout<<"\t\t...mit "<<a<<" Polygonen"<<endl;
            for(int i = 0; i < a; i++)
            {
                ifs>>b;
                if(b == 3)
                {
                    ifs>>Index1;
                    ifs>>Index2;
                    ifs>>Index3;
                    Pos[0][PosMenge] = vec[0][Index1];
                    Pos[1][PosMenge] = vec[1][Index1];
                    Pos[2][PosMenge] = vec[2][Index1];
                    PosMenge+=1;
                    Pos[0][PosMenge] = vec[0][Index2];
                    Pos[1][PosMenge] = vec[1][Index2];
                    Pos[2][PosMenge] = vec[2][Index2];
                    PosMenge+=1;
                    Pos[0][PosMenge] = vec[0][Index3];
                    Pos[1][PosMenge] = vec[1][Index3];
                    Pos[2][PosMenge] = vec[2][Index3];
                    PosMenge+=1;
                }
                if(b==4)
                {
                    ifs>>Index1;
                    ifs>>Index2;
                    ifs>>Index3;
                    ifs>>Index4;
                    Pos[0][PosMenge] = vec[0][Index1];
                    Pos[1][PosMenge] = vec[1][Index1];
                    Pos[2][PosMenge] = vec[2][Index1];
                    PosMenge+=1;
                    Pos[0][PosMenge] = vec[0][Index2];
                    Pos[1][PosMenge] = vec[1][Index2];
                    Pos[2][PosMenge] = vec[2][Index2];
                    PosMenge+=1;
                    Pos[0][PosMenge] = vec[0][Index3];
                    Pos[1][PosMenge] = vec[1][Index3];
                    Pos[2][PosMenge] = vec[2][Index3];
                    PosMenge+=1;
                    Pos[0][PosMenge] = vec[0][Index3];
                    Pos[1][PosMenge] = vec[1][Index3];
                    Pos[2][PosMenge] = vec[2][Index3];
                    PosMenge+=1;
                    Pos[0][PosMenge] = vec[0][Index4];
                    Pos[1][PosMenge] = vec[1][Index4];
                    Pos[2][PosMenge] = vec[2][Index4];
                    PosMenge+=1;
                    Pos[0][PosMenge] = vec[0][Index1];
                    Pos[1][PosMenge] = vec[1][Index1];
                    Pos[2][PosMenge] = vec[2][Index1];
                    PosMenge+=1;
                }
            }
        }
        if(str=="MeshNormals")
        {
            cout<<"\t\tneue Meshnormalen"<<endl;
            ifs>>str;
            if(str!="{")
            {
                cout<<"\t\t...mit dem Namen "<<str<<endl;
                ifs>>str;
            }
            ifs>>a;
            cout<<"\t\t...mit "<<a<<" Vertices"<<endl;
            for(int i = 0; i < a; i++)
            {
                ifs>>vec[0][i];
                ifs>>vec[1][i];
                ifs>>vec[2][i];
            }
            ifs>>a;
            cout<<"\t\t...mit "<<a<<" Polygonen"<<endl;
            for(int i = 0; i < a; i++)
            {
                ifs>>b;
                if(b == 3)
                {
                    ifs>>Index1;
                    ifs>>Index2;
                    ifs>>Index3;
                    Nor[0][NorMenge] = vec[0][Index1];
                    Nor[1][NorMenge] = vec[1][Index1];
                    Nor[2][NorMenge] = vec[2][Index1];
                    NorMenge+=1;
                    Nor[0][NorMenge] = vec[0][Index2];
                    Nor[1][NorMenge] = vec[1][Index2];
                    Nor[2][NorMenge] = vec[2][Index2];
                    NorMenge+=1;
                    Nor[0][NorMenge] = vec[0][Index3];
                    Nor[1][NorMenge] = vec[1][Index3];
                    Nor[2][NorMenge] = vec[2][Index3];
                    NorMenge+=1;
                }
                if(b==4)
                {
                    ifs>>Index1;
                    ifs>>Index2;
                    ifs>>Index3;
                    ifs>>Index4;
                    Nor[0][NorMenge] = vec[0][Index1];
                    Nor[1][NorMenge] = vec[1][Index1];
                    Nor[2][NorMenge] = vec[2][Index1];
                    NorMenge+=1;
                    Nor[0][NorMenge] = vec[0][Index2];
                    Nor[1][NorMenge] = vec[1][Index2];
                    Nor[2][NorMenge] = vec[2][Index2];
                    NorMenge+=1;
                    Nor[0][NorMenge] = vec[0][Index3];
                    Nor[1][NorMenge] = vec[1][Index3];
                    Nor[2][NorMenge] = vec[2][Index3];
                    NorMenge+=1;
                    Nor[0][NorMenge] = vec[0][Index3];
                    Nor[1][NorMenge] = vec[1][Index3];
                    Nor[2][NorMenge] = vec[2][Index3];
                    NorMenge+=1;
                    Nor[0][NorMenge] = vec[0][Index4];
                    Nor[1][NorMenge] = vec[1][Index4];
                    Nor[2][NorMenge] = vec[2][Index4];
                    NorMenge+=1;
                    Nor[0][NorMenge] = vec[0][Index1];
                    Nor[1][NorMenge] = vec[1][Index1];
                    Nor[2][NorMenge] = vec[2][Index1];
                    NorMenge+=1;
                }
            }
        }
        if(str=="MeshTextureCoords")
        {
            cout<<"\t\tneue Texturkoordinaten"<<endl;
            ifs>>str;
            if(str!="{")
            {
                cout<<"\t\t...mit dem Namen "<<str<<endl;
                ifs>>str;
            }
            ifs>>a;
            cout<<"\t\t...mit "<<a<<" Vertices"<<endl;
            for(int i = 0; i < a; i++)
            {
                ifs>>Tex[0][TexMenge];
                ifs>>Tex[1][TexMenge];
                TexMenge+=1;
            }
        }
    }
    if(NorMenge != PosMenge)
    {
        cout<<"\tDie Normalenvektoren stimmen nicht mit denen der Position überein\n"
            <<"konvertierung abgebrochen\n";
        return;
    }
    cout<<"\tKonvertierung abgeschlossen"<<endl;
    ofs<<"Start Position"<<endl;
    ofs<<PosMenge<<endl;
    for(int i = 0; i < PosMenge; i++)
    {
        ofs<<Pos[0][i]<<" "<<Pos[1][i]<<" "<<Pos[2][i]<<endl;
    }
    ofs<<"Start Normal"<<endl;
    ofs<<PosMenge<<endl;
    for(int i = 0; i < NorMenge; i++)
    {
        ofs<<Nor[0][i]<<" "<<Nor[1][i]<<" "<<Nor[2][i]<<endl;
    }
    ofs<<"Start Textur"<<endl;
    ofs<<TexMenge<<endl;
    for(int i = 0; i < TexMenge; i++)
    {
        ofs<<Tex[0][i]<<" "<<Tex[1][i]<<endl;
    }
    ofs<<"Ende"<<endl;
    cout<<"\tDaten gespeichert"<<endl;
    ifs.close();
    ofs.close();
    cout<<"\tDateien geschlossen"<<endl<<endl;
}




Mein eigenes Format ist einfach aufgebaut:

erst "Start", dann "Textur", "Normal", oder "Position".

.x hingegen arbeitet ja mit indizies. meistens zumindest, bei Position und Normalen ist es so. Jetzt will ich aber auch die Texturkoordinaten benutzen. Bei denen wird nicht mit Indizies gearbeitet. Um so besser, denk ich also und geh frisch ans Werk. Aber halt, warum gibt es denn nur so wenig Texturkoordinaten? Antwort: Sie benutzen sehr Wohl indizies-die gleichen wie die Positionsvektoren. Bis jetzt hab ich die aber(wie oben ersichtlich) nicht gespeichert. Wie soll ich dass bitteschön machen???

Bitte helft mir!

Phili

unregistriert

2

22.05.2006, 17:21

Keiner ne Idee? Nicht mal nix da? Na komm schon, das Format hatt sich doch(meines Wissens) Microsoft ausgedacht:-).

Nein im ernst, ich weiß ja nicht wirklich, wie dass Format aufgebaut ist, aber bisher hatt alles so gut geklappt(mit Positions und Normalenvektoren). und jetzt denk ich : Konvertierste halt schnell noch die Texturen - ist ja eh das gleiche wie die Nrmalen und Positionen
et boum, c'est le choc(Zitat aus dem Französischuntericht :lol: )-es Fehlen die Indizies.

Anonymous

unregistriert

3

22.05.2006, 19:17

X-Files sind ein nicht zu unterschätzendes Format - keine Frage!

Zum laden stellt Microsoft natürlich auch feine Interfaces bereit ;) OHNE Direct3D Extensions, die ja bekanntermaßen darauf zurückgreifen.

Such mal in Deiner Doku und per Live bzw. Google nach

IDirectXFile Interface << Für ASCII-X-Files
IDirectXFileBinary Interface << Für Binary-X-Files

Daraus entstehen dann so Dinge wie das IDirectXFileData Interface oder IDirectXFileDataReference Interface usw.

Sehr easy zu benutzen und erheblich Komfortabler als Direct3D Extensions ;)

Phili

unregistriert

4

22.05.2006, 20:07

Moment mal, du musst dir mein Prb schon richtug durchlesen ;)
ich will nen Konverter schreiben(bzw meinen Konverter erweitern), keinen Loader.
Ich will nur nen Vorschlag, wie man denn die Texturdaten miteinbeziehen könnte.

Anonymous

unregistriert

5

22.05.2006, 20:09

Phili
Konverter = Loader + Saver ;)

Phili

unregistriert

6

22.05.2006, 20:11

Na ja, so würds vielleicht nen Profi lösen, aber für mich langt im Grunde mein direkter weg. Ich hab ja bisher einfach die Vertizies als Vektoren eingelesen und dann nachdem alle Meshes eingelesen sind einfach gespeichert.
Weil das bisher erstklassig geklappt hat und auch schön einfach war, würd ich gern dabei bleiben.

Phili

unregistriert

7

25.05.2006, 12:52

Ok, habs mir überlegt. Hast mal wieder recht gehabt. ;)
Ohne richtigem Loader komm ich auf die dauer net wirkich weiter.

Gibts denn einen .x Loader, der Ohne IDirect3DDevice9 auskommt?
Ich will die Daten ja eigentlich nur als Vektoren haben, nicht als Vertex Buffer...

Auserdem würd ich den Konverter gerne Als Konsolen Programm schreiben, möglichst ohne dazu D3D zu Initialisieren.

Ich schätz mal das sind ziemlich viele Sonderwünsche :lol:

Phili

unregistriert

8

25.05.2006, 15:03

Muahaha
Problem gelöst, onverter von grund auf mit gescheitem Loader neugeschrieben, funktioniert einwandfrei!

Werbeanzeige