MAX导入导出插件略

     下午的时候假装很无聊,于是就无聊到去写当时说的导入插件。 用向导生成导入插件的代码雏形,鉴于向导生成代码的冗余,便对代码进行精简。首先向导生成的代码都不能直接运行,通常的错误表现为(1)宏定义重复使用了相同的数值;(2)类描述中的Create方法应修改为{return new ImportClass;};(3)类描述中的CreateManipulator()方法没有实现,修改简单实现为{return NULL;}。另外四个类被我干掉两个类,对剩余的两个类也进行了修整,以至基本可以完成导入功能。

    就导入插件而言,实现比较简单,并没有多少可说的地方。适我在写的过程中看到的一部分类、方法及代码,稍作分析说明。导入插件类继承于SceneImport类,这个类比较简单,方法也不多,这主要是因为导入插件功能比较单一。下面介绍一下这个SceneImport类。
    SceneImport类是创建文件导入插件的基类,这个类的方法用来描述插件的属性和控制导入的过程。主要的方法有:
    (1) SceneImport(),~SceneImport() 构造函数和析构函数,没必要多说。
    (2) int ExtCount() 用以返回导入插件支持的文件类型(文件扩展名)个数。
        TCHAR* Ext(int i) 用以返回支持的第i种文件类型的文件扩展名。
        TCHAR* LongDesc() 长字符串,用以描述导入插件所支持的类型文件
        TCHAR* ShortDesc() 短字符串,用以描述导入插件所支持的类型文件
    (3)TCHAR* AuthorName() 导入插件的著作者名
       TCHAR* CopyrightMessage() 导入插件的版权信息
       TCHAR* OtherMessage1() 第一条显示的消息字符串
       TCHAR* OtherMessage2() 第二条显示的消息字符串
       int Version() 导入插件的版本号,格式为版本号乘以100(如v3.01 = 301)
       void ShowAbout(HWND hWnd) 调用该方法时显示一个关于对话框
    (4)int DoImport() 核心方法,实际处理文件导入操作
       int ZoomExtents() 是否支持缩放扩展
    以上即为SceneImport类的所有方法,重要的方法主要就是设定支持文件类型及数目,以及实际处理读取文件的DoImport()函数。
    进行文件读取的操作在DoImport()函数中进行,实际上就是对文件数据的读取,然后为这些数据创建场景Object和Node等。这之间我恰好遇到 这样一个问题,即我在创建物体时用的是TriObject* tob = new TriObject;这在导入后显示都没有问题,但是当我重置或者关闭时都会报错,而且该物体在修改器里面显示是Mesh而不是Editable Mesh。后来经过不断的测试发现,问题原来是出现在物体的创建方式上,我将该创建方式改为TriObject* tob = CreateNewTriObject(),这样就可以了。但是我并不明白这两种创建方式有什么不同,当然我知道肯定是有区别的,我甚至都这两种 TriObject进行了对比,但是可能没有留意到区别。事实上用第二种方式肯定比第一种方式保险,因为它肯定比第一种直接创建类实例做了更多的工作。另 外就是确定导入模型的局部坐标系,为便于导入后的模型在MAX中容易操作,建议取模型中所有顶点坐标的平均值作为物体坐标系的原点。
     对于导出插件其实类似,导出插件继承于SceneExport类,该类的大部分方法和SceneImport类类似,只是导出功能的具体实现是在 DoExport()方法中。还有一个不同即是SceneExport类没有ZoomExtents()方法,取而代之是 SupportOptions()方法,该方法被3DS MAX调用,以决定对于某个指定的文件扩展名类型,是否支持一个或多几个导出选项,目前只有一种可用的选项SCENE_EXPORT_SELECTED, 而且该选项的意义未来也有可能发生改变。因此,这个方法其实很少被用到。
     场景中所有的物体都对应一个结点,场景中所有的结点构成一个树结构。首先Interface::GetRootNode()方法可以找到场景的根结点,根 结点并不悬挂任何物体;场景中其他物体或结点都属于这颗树的非根结点,遍历该树,就可以得到所有的结点信息,对结点对应物体信息的检测,可以得到我们需要 的物体模型信息,从而进行导出操作。因此我认为导出插件的难点在于如何获取场景中的所有信息而不是具体的导出操作。我做了一个仅仅导出几何物体结构的简单 插件作为测试,其他需要导出更复杂信息的操作类似。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值