Search code examples
c++model3ds

3DS model loading - tree/hierarchies


I am using the 3DS loader here:

http://www.flipcode.com/archives/Another_3DS_LoaderViewer_Class.shtml

It does a good job of loading and rendering the model, however it lacks any sense of heirarchy. As a result, all the objects in the model render at the origin.

In the code under: void Model_3DS::MainChunkProcessor(long length, long findex) is the line:

// I left this in case anyone gets very ambitious
case KEYF3DS :
    //KeyFrameChunkProcessor(h.len, ftell(bin3ds));
    break;

Nobody has implemented this anywhere, and I don't see any other 3DS loaders that implement it too. People seem to only post up and until they reach this point having been satisfied with anything rendering on to the screen at all.

What would KeyFrameChunkProcessor look like?


Solution

  • Google led me here:

    Keyframer chunk
    ---------------
    
      id          Description
      ----        -----------
      B00A        unknown
      7001        See first description of this chunk
      B008        Frames
      B009        unknown
      B002        Start object description
    
     * B008 - Frame information
    
     simple structure describing frame info
    
     start end size type            name
       0    3    4  unsigned long   start frame
       4    7    4  unsigned long   end frame
    
     *B002 - Start of Object info
    
     Subhunks
    
      id      Description
      ----    -----------
      B010    Name & Hierarchy
      B011*   Name Dummy Object
      B013    unknown
      B014*   unknown
      B015    unknown
      B020    Objects pivot point ?
      B021    unknown
      B022    unknown
      B030    unknown
    
     * B010 - Name & Hierarchy descriptor
    
     start end  size type          name
     0      ?    ?   ASCIIZ        Object name
     ?      ?    ?   unsigned int  unknown
     ?      ?    ?   unsigned int  unknown
     ?      ?    ?   unsigned int  Hierarchy of Object
    
     The object hierarchy is a bit complex but works like this.
     Each Object in the scene is given a number to identify its
     order in the tree. Also each object is orddered in the 3ds
     file as it would appear in the tree.
     The root object is given the number -1 ( FFFF ).
     As the file is read a counter of the object number is kept.
     Is the counter increments the object are children of the
     previous objects.But when the pattern is broken by a number
     what will be less than the current counter the hierarchy returns
     to that level.
    
     for example.
    
        object   hierarchy
        name
    
            A      -1
            B       0                 This example is taken
            C       1                 from 50pman.3ds
            D       2
            E       1                 I would really reccomend
            F       4                 having a look at one of the
            G       5                 examples with the hierarchy
            H       1                 numbers to help work it out.
            I       7
            J       8
            K       0
            L      10
            M      11
            N       0
            O      13
            P      14
    
    
                               A
             +-----------------+----------------+
             B                 K                N
        +----+----+            +                +
        C    E    H            L                O
        +    +    +            +                +
        D    F    I            M                P
             +    +
             G    J
    
     Still not done with this chunk yet !
     If the object name is $$$DUMMY then it is a dummy object
     and therefore you should expect a few extra chunks.