新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 网格模型高级技术(1) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 19635 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: 网格模型高级技术(1) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 网格模型高级技术(1)

    在三维图形程序设计中,网格模型占有非常重要的地位,而且也是比较复杂的部分,特别是包含动画和蒙皮信息的网格模型。

    .x文件格式分析

    .x文件格式最初是为传统的Direct3D保留模式而设计的,在DirectX 6.0问世后,针对立即模式对它作过一次扩展。要想在Direct3D程序中灵活自如地使用网格模型,应当深入理解.x文件格式。

    .x文件是由模板(template)驱动的,模板定义了如何存储一个数据对象,这样用户便可以自己定义具体的格式。Direct3D预定义了许多模板,这些预定义的模板位于rmxftmpl.h中,模板标识符都在rmxfguid.h中,通用文件DXUTMesh.cpp包含了这两个头文件。模板所允许的数据类型称为可选成员(optional member),这些可选成员作为数据对象的子对象来保存,子对象可以是另一种数据类型或对先前数据对象的引用,或是一个二进制对象。

    来看一个.x文件(cube_1.x)的完整内容:

    xof 0302txt 0064
    Header { 1; 0; 1;}
    Mesh Cube {   //网格 8;                                //8个顶点,以下为8个顶点的坐标 1.000000;1.000000;-1.000000;,  -1.000000;1.000000;-1.000000;, -1.000000;1.000000;1.000000;,  1.000000;1.000000;1.000000;, 1.000000;-1.000000;-1.000000;, -1.000000;-1.000000;-1.000000;, -1.000000;-1.000000;1.000000;, 1.000000;-1.000000;1.000000;;
     12;            // 12个面, 以下为每个面三个顶点的索引 3;0,1,2;, 3;0,2,3;, 3;0,4,5;, 3;0,5,1;, 3;1,5,6;, 3;1,6,2;, 3;2,6,7;, 3;2,7,3;, 3;3,7,4;, 3;3,4,0;, 3;4,7,6;, 3;4,6,5;;}
    该模型的效果图如下:

    按此在新窗口浏览图片

    第一行文件头中的 "xof"告诉程序,它加载的文件是一个.x文件,"0302"表示它使用的是DirectX 3.2 版本的模板,"txt"表示这些数据是以文本形式存储的,"0064"定义了浮点数的位数是64位。

    文件头后面的一个数据块涉及了模板和数据对象等内容。一个模板和一个数据对象之间的差异在于所有的模板都是以一个template单词开始,模板看起来很像一个C语言的结构定义,数据对象就是那些模板的实例。使用模板定义包含在.x文件里的数据对象(一个模板定义了数据对象的布局),每个模板都可以通过一个数据类型的集合去定义并容纳任何类型的数据。同时,任何数据类型的组合都可以在一个模板里使用。

    模板header的定义如下:

    template Header { <3D82AB43-62DA-11cf-AB39-0020AF71E433> WORD major; WORD minor; DWORD flags;}
    各成员分别表示.x文件最大版本,最小版本,以及定义方式。

    .x文件中涉及模板的概念,它由四部分组成:第一部分是模板的名字,可是由数字、字符、下划线构成,但不能以数字开头,第二部分是GUID(Global Unique Identifier,全局唯一标识符),第三部分由各个数据项构成,最后一部分用于控制模板的限制程度,一个模板可以是开放的、闭合的或受限的。开放模板的定义在结束部位有一个待展开的方括号[...]表示它可以包含其他数据类型,封闭模板不能包含其他任何数据类型,受限模板只能包含特定的数据类型。模板的使用与结构体有相似之处。

    一般情况下,.x文件都至少包含一个Mesh模板,其定义如下:

    Defines a simple mesh. The first array is a list of vertices, and the second array defines the faces of the mesh by indexing into the vertex array.

    template Mesh{    <3D82AB44-62DA-11CF-AB39-0020AF71E433>    DWORD nVertices;    array Vector vertices[nVertices];    DWORD nFaces;    array MeshFace faces[nFaces];    [...]}
    Where:

    nVertices - Number of vertices.
    array Vector vertices[nVertices] - Array of vertices, each of type Vector.
    nFaces - Number of faces.
    array MeshFace faces[nFaces] - Array of faces, each of type MeshFace.
    [ ... ] - Any .x file template can be used here. This makes the architecture extensible. Material and TextureFilename templates are typically used.
    Mesh模板是一个开放的模板,同时它还用到了Vector模板和MeshFace模板,它们的定义如下:

    Defines a vector.

    template Vector {     < 3D82AB5E-62DA-11cf-AB39-0020AF71E433 >     float x;     float y;     float z; }
    Used by the Mesh template to define a mesh's faces. Each element of the nFaceVertexIndices array references a mesh vertex used to build the face.

    template MeshFace{    < 3D82AB5F-62DA-11cf-AB39-0020AF71E433 >    DWORD nFaceVertexIndices;    array DWORD faceVertexIndices[nFaceVertexIndices];}
    Where:

    nFaceVertexIndices - Number of indices.
    array DWORD faceVertexIndices[nFaceVertexIndices] - Array of indices.
    因为没有为网格模型设置材质和纹理等信息,所以该文件显示效果是一个黑色立方体,接下来将为该立方体添加材质、法线和纹理信息。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/12/15 15:25:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2026/3/6 15:15:57

    本主题贴数9,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  网格模型高级技术(1)(4096字) - 卷积内核,2008年12月15日
        回复:  这么每人顶啊(12字) - 秋十三,2009年2月16日
            回复:  [quote][b]以下是引用[i]秋十三在2009-2-16 13:18:00[/i]的发言:[..(189字) - 卷积内核,2009年2月18日
        回复:  好啊我喜欢(12字) - 秋十三,2009年1月2日
        回复:  主程序:#include "dxstdafx.h"#include "resource.h..(17552字) - 卷积内核,2008年12月15日
        回复:  Direct3D对加载到内存中的网格模型提供了优化功能,通过网格模型优化可以明显提高三维模型的渲染..(9683字) - 卷积内核,2008年12月15日
        回复:  为了使一个.x文件产生动画,必须至少提供一个动画集,每个动画集都应具有一个对某个框架的引用。模板 ..(8412字) - 卷积内核,2008年12月15日
        回复:  通过前面的介绍,可以建立起一个网格模型,但这个网格模型是浑然一体的,而在现实生活中,为了能独立对一..(4179字) - 卷积内核,2008年12月15日
        回复:  我们在cube_1.x的基础上添加材质、法线和纹理,构成cube_2.x:xof 0302tx..(8194字) - 卷积内核,2008年12月15日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    70.313ms