当前位置: 首页 > 工具软件 > lib3ds > 使用案例 >

3ds格式(3ds ftk), 还没有采用lib3ds库

屠盛
2023-12-01

这两天写了一个用数据手套驱动3ds手骨骼模型实时运动的程序(使用的3dsftk),发现用这个工具操作3ds模型有些固定的模式和这种格式固有的特点,总结如下:

3ds使用小结:

  • 一个3ds文件的每一个mesh顶点都从0开始索引,这一点可以从facearray中保存的顶点索引看出来;
  • 对3ds的每个指针(比如mesh3ds *)最好都赋初始值NULL,否则可能不会给其非配空间;
  • 在从database里request数据时(比如request a mesh named M),要先调用初始化语句(比如要先将mesh3ds初始化);
  • 没有读取normal,只能自己写程序计算;
  • mesh的旋转与平移保存在locmatrix[12]中,前9个数字式旋转矩阵,后3个数字是平移量;
  • 父子关系保存在kemesh3ds中的parent[22];
  • 3ds格式的数据是很老的格式,而且3dsftk已经很久没有更新过,功能也很有限,其保存顶点数量有限(很少),仅有的拓扑数据只是面索引,每个面包含哪三个顶点,没有边的索引信息,不像OpenMesh,TriMesh这样的数据结构访问数据的功能很强大。
  • 如果要使某个mesh绕其父节点运动起来,就得遍历到其祖先节点(假设其对应locmtrixANCE),将mesh的每个点(首先做一个locmtrixANCE所对应的平移T的逆(即移回原点),接着做一个locmtrixANCE所对应的旋转R,最后再进行T.这3步用P表示),之后依次对这个祖先节点下的每个节点进行P这样的操作。

3ds格式说明:

Autodesk 3D Studio File Format

一个3ds程序例子:

Small Tips : 如何整合3DS模型中的Obj

另外还有一个开源的3ds库对3ds支持的多一些--lib3ds,具有生成normal等等信息的功能,对3ds的封装也更好。

lib3ds帮助文档:lib3ds documentation

一个lib3ds的入门程序:Lib3ds tutorial: My first model

3ds ftk采用的数据格式:

typedef struct {
   char3ds name[11];       /* Object name */
   byte3ds ishidden;       /* Hidden object flag */
   byte3ds isvislofter;    /* Lofter visibility flag */
   byte3ds ismatte;        /* Matte object flag */
   byte3ds isnocast;       /* Doesn't cast shadow's flag */
   byte3ds isfast;         /* Fast display flag */
   byte3ds isnorcvshad;    /* Doesn't recieve shadows */
   byte3ds isfrozen;       /* Frozen object flag */
   ushort3ds nvertices;    /* Vertice count */
   point3ds *vertexarray;  /* List of vertices */
   ushort3ds nvflags;      /* Number of vertex flags */
   ushort3ds *vflagarray;  /* List of vertex flags */
   ushort3ds ntextverts;   /* Number of texture vertices */   
   textvert3ds *textarray; /* List of texture coordinates */
   byte3ds usemapinfo;     /* Boolean for use of mapping icon information */
   mapinfo3ds map;         /* Mapping icon info */
   float3ds locmatrix[12]; /* Object orientation matrix */
   ushort3ds nfaces;       /* Face count */
   face3ds *facearray;     /* List of faces */
   ulong3ds *smootharray;  /* Smoothing group assignment list */
   byte3ds useboxmap;     /* Boolean used to indicate the use of box mapping */
   char3ds boxmap[6][17];  /* Material names used in boxmapping */
   ubyte3ds meshcolor;     /* UI color assigned to the mesh */
   ushort3ds nmats;        /* Assigned materials count */
   objmat3ds *matarray;    /* Material assignment list */
   byte3ds useproc;        /* Use animated stand-in flag */
   ulong3ds procsize;      /* Size of animated stand-in data */
   char3ds procname[13];   /* Name of animated stand-in procedure */
   void3ds *procdata;      /* Animated stand-in data */
} mesh3ds;  

3ds的运动数据格式:

typedef struct {
   char3ds name[11];     /* Name of mesh */
   char3ds parent[22];   /* Name of parent object */
   ushort3ds flags1;     /* flags field from node header  */
   ushort3ds flags2;     /* flags2 field from node header  */

   point3ds pivot;       /* Object pivot point */
   char3ds instance[11]; /* Object instance name */
   point3ds boundmin;    /* Minimum bounding box point for dummy objects */
   point3ds boundmax;    /* Maximum bounding box point for dummy objects */

   ulong3ds npkeys;      /* Number of position keys */
   short3ds npflag;      /* Loop control flag for position keys */
   keyheader3ds *pkeys;  /* Spline values for position keys */
   point3ds *pos;        /* Mesh position keys */

   ulong3ds nrkeys;      /* Number of rotation keys */
   short3ds nrflag;      /* Loop control flag for rotation keys */
   keyheader3ds *rkeys;  /* Spline values for rotation keys */
   kfrotkey3ds *rot;     /* Rotation keys */

   ulong3ds nskeys;      /* Number of scaling keys */
   short3ds nsflag;      /* Loop control flag for scaling keys */
   keyheader3ds *skeys;  /* Spline values for scaling */
   point3ds *scale;      /* Mesh scaling keys */

   ulong3ds nmkeys;      /* Number of morph keys */
   short3ds nmflag;      /* Loop control flag for morph keys */
   keyheader3ds *mkeys;  /* Spline values for morph keys */
   kfmorphkey3ds *morph; /* Morph keys */

   ulong3ds nhkeys;      /* Number of hide keys */
   short3ds nhflag;      /* Loop control flag for hide keys */
   keyheader3ds *hkeys;  /* Spline values for hide keys */
   float3ds msangle;     /* Morph smoothing group angle */
} kfmesh3ds;

 类似资料: