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

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

1

06.12.2004, 18:12

3DS-Format / Materialchunk

beschäftige mich gerade mal wieder mit 3ds-dateien und versuche den model-converter von david dazu zu bringen meine aus cinema 4d exportierten files korrekt zu importieren...
hat mit dem model jetzt auch ganz gut geklappt, leider liest er die material chunks noch nicht korrekt ein und ich blick durch die Read3DSMaterialChunk funktion noch nicht ganz durch...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
case 0xA010: // Indirekte Farbe

case 0xA020: // Streufarbe

case 0xA030: // Glanzfarbe

    // Farbe lesen

    printf("Farbe gefunden: ");
    if(tbProceedTo3DSChunk(pVFile, 0x0011))  [b]<----------[/b]
        pVFile->Seek(TB_VFSO_CURSOR, ChunkHeader.dwChunkSize - sizeof(tb3DSChunkHeader));
    else {
        pVFile->Read(sizeof(BYTE), &r);
        pVFile->Read(sizeof(BYTE), &g);
        pVFile->Read(sizeof(BYTE), &b);

        // Farbe ins Fließkomma-RGB-Format umwandeln und speichern

        switch(ChunkHeader.wChunkID)
        {
        case 0xA010: pOut->AmbientColor = tbColor((BYTE)(r), g, b, 0); printf("ambient"); break;
        case 0xA020: pOut->DiffuseColor = tbColor((BYTE)(r), g, b, 255); printf("streufarbe"); break;
        case 0xA030: pOut->SpecularColor = tbColor((BYTE)(r), g, b, 0); printf("glanzfarbe"); break;
        }
    }
    break;


das problem scheint zu sein, dass er den chunk 0x0011 nicht findet und die gefundene farbe somit überspringt. 0x0011 ist ein subchunk der farb chunks der ambient, diffuse und specular color und wird in einer mli dokumentation so beschrieben:

Zitat


Subchunks of these material characteristics (level 3)
-----------------------------------------------------

0011 RGB1
0012 RGB2

Each of the three color chunks have 2 subchunks that defines their
colors. It seems that RGB1 is the color with a gamma (which one ?)
and RGB2 is the same color but as displayed on top of the material
editor window. But I'm not quite sure why there is two aspects
of the same color and what it does.


ich stehe momentan auf dem schlauch... danke.

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

2

06.12.2004, 18:24

cool, habe gerade gemerkt, dass meine "änderungen" (https://www.spieleprogrammierer.de/index…ht=3ds&start=15) in der zweiten auflage übernommen wurden *freu*


habe ich das jetzt verhauhen, oder funktioniert der material-import generell nicht? auch wenn ich die beispiel 3ds dateien, zb von galactica, importieren will, erkennt er die materialfarben nicht korrekt (immer alles 0.0)...

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

3

12.12.2004, 13:39

hey ich bin verwirrt und brauche hilfe.
liest er bei euch die materialien korrekt ein???

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

4

12.12.2004, 14:17

habe grade festgestellt, dass es mit den modellen von galactica geht. der farbchunk 0011 existiert und es klappt alles. öffne ich es mit cinema und speicher es, geht das ganz nicht mehr.... :-( irgendwie scheints sich da was geändert zu haben. verdammte kacke.....

Dave

Alter Hase

  • »Dave« ist der Autor dieses Themas

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

5

12.12.2004, 15:32

JUHUU

habs endlich hinbekommen *g* wie vermutet lag das problem beim auslesen des farbwertes. die farbwerte können als byte oder float abgespeichert werden! cinema scheint sie als floats zu speichern, was der modelconverter jedoch nicht beherrscht.
habe mir jetzt ne kleine funktion zum laden von farbwerten geschrieben, mit welcher es einwandfrei funktioniert.

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
tbColor readColor(tbVFile* pVFile)
{
    tb3DSChunkHeader    ChunkHeader;
    float               fColor[3];
    BYTE                byteColor[3];

    pVFile->Read(sizeof(tb3DSChunkHeader), &ChunkHeader);

    switch (ChunkHeader.wChunkID) {
        case 0x0010: // rgb color float format

        case 0x0013: // rgb color float format (gamma corrected)

            pVFile->Read(sizeof(FLOAT), &fColor[0]);
            pVFile->Read(sizeof(FLOAT), &fColor[1]);
            pVFile->Read(sizeof(FLOAT), &fColor[2]);
            return tbColor(fColor[0], fColor[1], fColor[2]);

        case 0x0011: // rgb color byte format

        case 0x0012: // rgb color byte format (gamma corrected) 

            pVFile->Read(sizeof(BYTE), &byteColor[0]);
            pVFile->Read(sizeof(BYTE), &byteColor[1]);
            pVFile->Read(sizeof(BYTE), &byteColor[2]);
            return tbColor(byteColor[0], byteColor[1], byteColor[2]);

        default:
            return tbColor(0.0f, 0.0f, 0.0f);
    }
}


Read3DSMaterialChunk habe ich wie folgt geändert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case 0xA010: // Indirekte Farbe

    // Farbe einlesen

    pOut->AmbientColor = readColor(pVFile);
    break;

case 0xA020: // Streufarbe

    // Farbe einlesen

    pOut->DiffuseColor = readColor(pVFile);
    break;

case 0xA030: // Glanzfarbe

    // Farbe einlesen

    pOut->SpecularColor = readColor(pVFile);
    break;

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

6

12.12.2004, 17:32

Super 8)
"Games are algorithmic entertainment."

Werbeanzeige