3DSFTK 与 lib3DS
来源:互联网 发布:用python写网络爬虫书 编辑:程序博客网 时间:2024/06/13 02:31
3DSFTK - 3D Studio File Toolkit
简介:3ds file format library.autodesk的官方读写3ds的库.文档俱全(各种函数均有详细的介绍),是读3ds的超级好库.(可以读取3ds中的mesh信息,动画信息,light信息等等,一应俱全啊)
这两天写了一个用数据手套驱动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
lib3ds
另外还有一个开源的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;
- 3DSFTK 与 lib3DS
- 基于lib3ds和OpenGL的3ds文件的读取与显示
- lib3ds加载3ds文件通过opengl显示
- [lib3ds] 开源3ds文件解析库(一):基础
- Lib3DS教程
- Lib3DS教程
- 3ds格式(3ds ftk), 还没有采用lib3ds库
- lib3ds 2.0 example 2
- lib3ds 2.0 example 2
- An example of lib3ds 2.0 with opengl32
- lib3ds 2.0 和 opengl32 例子程序
- lib3ds教程:我的第一个模型
- jsp study 3 变量与与数据
- 3d与人生
- Ethernet与IEEE802.3
- 速度与激情3
- 现代科学与佛【3】
- AMR与3GPP
- RakNet最简单的服务器客户端程序
- zh_CN.UTF-8 环境下 Putty 的配置
- 怎么判断文件是否被占用
- 尊严的出处
- 1100. Final Standings
- 3DSFTK 与 lib3DS
- 关于男方陪产假问题
- 探讨i++和++i
- stat命令输出结果中, Access,Modify,Change的含义
- Exception-Handling Antipatterns
- 泛型
- xml解析器实现过程
- 学习MongoDB--(1):MongoDB简介
- IE6下链接a的onclick事件点击无反应的处理方法