这两天写了一个用数据手套驱动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;

3ds格式(3ds ftk), 还没有采用lib3ds库相关推荐

  1. java如何使用3dmax中的文件_在java3d里面使用3DS格式的文件

    在SUN的J3D里面并没有提供对3DS格式的文件的导入.但是3DS格式的文件又很常见.为此,我们需要借用第三方的工具,来把3DS里面的模型导入到程序中. 我们用的是Loader3ds这个工具 我们还是 ...

  2. opengl加载显示3DS模型3DS类型文件

    opengl加载显示3DS模型UC类型文件 前置条件 注意事项 项目展示 项目完整C++源代码 前置条件 opengl三方库freeglut,显示3DS格式的三维模型文件 注意事项 源代码 model ...

  3. 为什么大公司还在采用过时的技术?

    作者:孤独烟,中国平安银行后端工程师 来自:http://rjzheng.cnblogs.com/ 0 背景 本文出自一朋友给我的提问,于是博主呕心沥血给他花式洗脑了几个小时.忽然发现,应该还有许多朋 ...

  4. 大公司为什么还在采用过时的技术

    2019独角兽企业重金招聘Python工程师标准>>> 大公司为什么还在采用过时的技术 背景 本文出自一朋友给我的提问,于是博主呕心沥血给他花式洗脑了几个小时.忽然发现,应该还有许多 ...

  5. 【原创】大公司为什么还在采用过时的技术

    背景 本文出自一朋友给我的提问,于是博主呕心沥血给他花式洗脑了几个小时.忽然发现,应该还有许多朋友有同样的疑问.所以整理成文. 许多刚毕业的程序员朋友,都有一个执念,想要进那种规模大一点的公司.上市的 ...

  6. python采用pika库使用rabbitmq总结,多篇笔记和示例

    这一段时间学习了下rabbitmq,在学习的过程中,发现国内关于python采用pika库使用rabbitmq的资料很少,官网有这方面的资料,不过是都英文的.于是笔者结合自己的理解,就这方面内容写了一 ...

  7. opencv入门课程:彩色图像灰度化和二值化(采用skimage库和opencv库两种方法)

    用最简单的办法实现彩色图像灰度化和二值化: 首先采用skimage库(skimage库现在在scikit_image库中)实现: from skimage.color import rgb2gray ...

  8. linux 如何查看终端格式,你应该还不知道,Linux终端下的 Markdown 文档查看器

    原标题:你应该还不知道,Linux终端下的 Markdown 文档查看器 现在,Markdown 差不多已经成为技术文档的标准.它可以实现技术文档的快捷写作,以及输出发布.同样都是标记语言,但Mark ...

  9. 如何把不同尺寸ico格式图标_还在为图标设计犯难?这篇告诉你图标设计so easy!...

    UI最重要组建之一就是图标,随着扁平化设计的发展趋势,越来越注重图标的简洁与寓意表达,平面图标已占主导地位. 什么是图标? 图标正确打开方式是这样的! ico图标其实是icon file的缩写形式,它 ...

最新文章

  1. 合并文件夹中子目录_如何整理文件夹,看这一篇就够了,简单易学
  2. php面试题11(边看边复习刚刚讲的)(array_multisort($arr1,$arr2); 用$arr1来排序$arr2。)...
  3. ES6语法的学习与实践
  4. 一次代码优化实践,用了模板方法+策略+工厂方法模式
  5. 动态规划经典题:给出两个字符串s1和s2,返回其中最大的公共子串
  6. Effective C++: 05实现
  7. SpaceX载人龙飞船意外爆炸,据称几乎被完全摧毁
  8. 学python能做什么-学完Python可以做什么?
  9. 基于arduino uno + WS2812b RGB灯带单一颜色跑马灯控制程序
  10. 利用python画简单图形示例代码_使用python画社交网络图实例代码
  11. zotero中的标准和规范应该用什么类型
  12. PICkit 3编程器错误
  13. 项目配置多Redis数据源(Redis分片)
  14. 1024程序员节:技术大神齐聚直播间,等你来互动!
  15. Microsoft Office 2013 word MathType 报错 (MathPage.wll)
  16. Debian下安装Mosquitto
  17. 网页实现从数据库读取数据并简单分页
  18. Android 备份(提取)apk
  19. 视频丨中兴通讯齐聚全球合作伙伴的力量 拥抱最好的时代
  20. 政务服务一网通办云平台及智慧政务大数据资源中心建设方案

热门文章

  1. 【AXI】解读AXI协议双向握手机制的原理
  2. Revit开发之剪切InstanceVoidCutUtils
  3. Microsoft PPT常用操作
  4. Java SSM (springboot+mybatis)美食菜谱分享平台系统设计和实现以及论文报告
  5. 进程间通信那种效率最高_进程间通信的几种方式的介绍及比较
  6. js 控制浏览器 实现全屏 和 退出全屏功能
  7. STM32L051 低功耗特性分析
  8. JFrame改变边界为圆角矩形
  9. 百度地图个性化地图编辑,本地正常,线上失效问题
  10. ⁉️socket实现Ping命令打造⚡BOSS来了⚡摸鱼神器⭐干货巨多❤️建议收藏❤️