3DMax插件和它的3DXI接口

3DXI是3DMax提供给游戏开发者的一套数据读取接口,之前它被称作为IGame。

最近一直在搞Ogre的插件
相关的文档都很少
我相信搞这个的人很多,但是有时间整理拿出来共享的资料实在是太少
Ogre自带的maxExplorer只是xml格式,二进制数据的导出竟然未完成,汗一个
Lexi的搞得很复杂,还绑上了Ogre本身,通过Ogre的mesh接口导出,阅读和使用上很麻烦

我的方法很土
用oFusion导出,然后通过Ogre的序列化接口跟踪
参考mesh的format文件头描述信息,编写自己的格式导出

遇到的问题很多
像是3DXI本身的接口说明就不太清晰
例如一个TexCoord就有几种方式可以读取,却没有注明,当GetActiveMapChannelNum().Count() == 1时应该用GetTexVertex,否则应该用GetMapFaceIndex或GetMapVertex
带来了不小的困扰
另外,3DXI只负责收集数据,当遇到MultiMaterial时,手动拆分和复制vertices的工作还是要自行解决
google到的资料上,前辈们都说自从有了3DXI,挺对得起这张脸,俺没有之前旧接口的切身体验,么有感觉

总的来说,Ogre本身对于plugin的资料不是太多,加上3DXI SDK的说明中还存在有少量的BUG,所以走了不少弯路

大家有空可以看看现在max9 sdk里 Programmer's Guide里 Programming with 3dxi里的IGameMesh有一段代码

//gm is a pointer to IGameMesh
if(exportMappingChannel)
{
    Tab<int> mapNums = gm->GetActiveMapChannelNum();
    int mapCount = mapNums.Count();
 
    for(int i=0;i < mapCount;i++)
        int vCount = gm->GetNumberOfMapVerts(mapNums[i]);
    buf.printf("%d",vCount);
    for(int j=0;j<vCount;j++)
    {
        vert = NULL;
        Point3 v;
        if(gm->GetMapVertex(mapNums[i],j,v))
        {
            //use data here
        }
    }
    int fCount = gm->GetNumberOfFaces();
 
    for(int k=0;k<fCount;k++)
    {
        DWORD v[3];
        gm->GetMapFaceIndex(mapNums[i],k,v);
        //use data here
    }
}

这一段是从之前老的SDK中同样地方的一段代码

 

 //gm is a pointer to IGameMesh

 if(exportMappingChannel)

 {

  Tab<int> mapNums = gm->GetActiveMapChannelNum();

  int mapCount = mapNums.Count();

  

  for(int i=0;i < mapCount;i++)

  {

      

   int vCount = gm->GetNumberOfMapVerts(mapNums[i]);

   buf.printf("%d",vCount);

   for(int j=0;j<vCount;j++)

   {

    vert = NULL;

    Point3 v;

    if(gm->GetMapVertex(mapNums[i],j,v))

    {

     //use data here

    }

  

   }

   int fCount = gm->GetNumberOfFaces();

  

   for(int k=0;k<fCount;k++)

   {

    DWORD  v[3];

    gm->GetMapFaceIndex(mapNums[i],k,v);

    //use data here

   }

  }

 }


大家来找岔~

目前我的插件中,关于mesh这边的导出工作基本上已经完成
1. position, diffuse, normal, texcoordx的导出
2. multi material的处理
3. 最小化vertex复制/拆分
4. material及sub-material数据导出
5. texture自动复制

接下来准备做mesh关键帧动画和骨骼动画这一块
待完成后我会抽时间写篇文章出来共大家共享
或者先提交给《游戏创造》骗点稿费过来花花也未尝不是一个好主意^_^Y

转载于:https://www.cnblogs.com/oiramario/archive/2007/11/27/973722.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Web Game 架构设计1--服务器基本结构

ASP.NET Web Game 架构设计1--服务器基本结构 1. 基本结构图 2. 系统组成与角色 整个系统大体上分为三个部分&#xff1a;1.网页客户端。2.IIS Web服务器。3.数据库及逻辑服务器。其中Web服务器不处理任何逻辑&#xff0c;它的作用只有两点&#xff1a;1.承载用户。…

人人网 Windows Phone 7 应用开发起步

目前&#xff0c;人人网在国内高校学生中的普及率非常高。前段时间&#xff0c;大概是11月下旬的样子&#xff0c;人人网发布了Windows Phone 7客户端的公测版。我想&#xff0c;Windows Phone 7本地化的优劣&#xff0c;直接关系到其将来在国内的市场份额。而诸如人人等针对学…

XP Sp2下双机通过无线网卡实现Internet共享

两台均有无线网卡、装有XP SP2系统的计算机如何实现共享Internet上网呢&#xff0c;请参考一下步骤&#xff1a; 1、打开两台计算机的无线网络连接属性&#xff0c;并切换至“无线网络配置”页签。2、点中右下角的高级按钮设置&#xff0c;选中最下面的“仅计算机到计算机” 和…

SimpleDateFormat解析的时候字符串过长问题

竟然不会报错&#xff1b; try {SimpleDateFormat dateFormatFrom new SimpleDateFormat("yyyyMMddHHmmss");String dateStr "2015080910400000";Date parse dateFormatFrom.parse(dateStr);System.out.println(parse);} catch (Exception e) {e.printS…

C#面向对象设计模式第九讲:Composite 组合模式(结构型模式)

&#xff08;根据MSDN Webcast相关课程整理&#xff09; 由俄罗斯套娃讲起。娃娃里又包含另一个娃娃&#xff0c;最后那个不包含任何娃娃。 组合模式&#xff0c;采用树型结构来实现普遍存在的对象容器&#xff0c;将本原一对多的复杂的关系&#xff0c;转换成一对一的简单关系…

https://enhancer.io

enhancer.io 转载于:https://juejin.im/post/5d4aad7bf265da03bf0f2d01

chmod命令详细用法

指令名称 : chmod 使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。 参数 : mode : 权限设定字串&#xff0c;格式如下…

是用Entity.Save(),还是用DAL.Save(Entity e)

是用Entity.Save()&#xff0c;还是用DAL.Save(Entity e) 自从上一次写关于ORM的文章已经是几个月前的事情了&#xff0c;在这里先贴一下文章的地址&#xff0c;如果大家感兴趣的话可以去看看。 1、支持差异数据保存的数据库实体类设计——处女作 2、支持差异数据保存的数据库实…

Docker for Windows

安装条件&#xff1a;必须是 Win10 Pro 或者 Enterprise version. 转载于:https://www.cnblogs.com/qijiage/p/9261258.html

【Android】 -- 使用UncaughtExceptionHandler捕捉全局异常

在综合统计SDK(欧盟统计局的朋友&#xff0c;百度统计)之后。有一个非常有利的功能测试&#xff1a;错误分析。此功能可以在程序的执行中遇到崩溃(runtimeException)反馈给server&#xff0c;帮助开发者提高产品。多功能适配器机。 然而在公司android开发中不集成这些SDK&#…

《火影忍者:究级风暴》渲染技术究极解析!

http://www.opengpu.org/forum.php?modviewthread&tid6609 与Takara Tomy公司的《火影忍者》系列游戏不同&#xff0c;初次登陆PS3平台的本作是由日本CyberConnect2制作的对战格斗游戏《火影忍者&#xff1a;终极英雄》系列的最新作。虽然游戏的开发商仍然是CyberConnect2…

文本框只能输入数字代码

1.文本框只能输入数字代码(小数点也不能输入)<input οnkeyup".replace(/\D/g,)" onafterpaste".replace(/\D/g,)"> 2.只能输入数字,能输小数点.<input οnkeyup"if(isNaN(value))execCommand(undo)" onafterpaste"if(isNaN(value…

说说大型高并发高负载网站的系统架构(ZT)

我在Cernet做过拨号接入平台的搭建&#xff0c;而后在Yahoo3721负载搜索引擎前端平台开发&#xff0c;又在猫扑处理过大型社区猫扑大杂烩的架构升级等工作&#xff0c;同时自己接触和开发过不少大中型网站的模块&#xff0c;因此在大型网站应对高负载和并发的解决方案上有一些积…

工程中新增Properties

如一开始工程中是没有Properties文件夹的&#xff01; 但工程目录文件夹下却有一个Properties&#xff1a; 现在要向这个Properties文件夹中添资源文件。操作步骤&#xff1a; [添加新项]->[资源文件] 再将Resource.resx文件拉到Properties DONE!!!

取得MS SQL 2000数据库一个表的所有列名

经常做的一个操作&#xff0c;列出数据库中一个表的所有列名。方法如下&#xff1a;先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再从SYSCOLUMN表中取得该表的所有列名。SQL语句如下&#xff1a;use dbname --dbname改为你要…

ASP六大对象介绍

1、Application对象 Application对象是个应用程序级的对象&#xff0c;用来在所有用户间共享信息&#xff0c;并可以在Web应用程序运行期间持久地保持数据。 Application的属性&#xff1a;   方法如下&#xff1a;   Application对象没有内置的属性&#xff0c;但…

二分模版

详情请见http://blog.csdn.net/int64ago/article/details/7425727 //二分查找&#xff08;找到返回左端&#xff0c;找不到返回右端&#xff09; int bSearch(int x,int y,int g) {int mid,lx,ry;while(l<r){mid(lr)>>1;if(a[mid]>g) rmid-1;else lmid1;}return l;…

Django:序列化的几种方法

前言 关于序列化操作&#xff0c;就是将一个可迭代的数据结构&#xff0c;通过便利的方式进行我们所需要的操作。 今天历来归纳一下&#xff0c;Django中的几种不同得分方法&#xff0c;已经Django-restframework提供的方法 创建一个Django的项目 再新建一个app 创建一个模型&a…

让atmega8可以和飞思卡尔xs128一样对IO引脚进行定义

好吧&#xff0c;不得不承认&#xff0c;我使用飞思卡尔的XS128单片机已经非常之习惯了&#xff0c;结果一上手atmega8&#xff0c;最令我反感的就是atmega8不能对IO引脚进行操作&#xff0c;非要用些繁琐的位操作。我就不&#xff0c;我就要像飞思卡尔那样操作。。。 于是。。…

c#通过app.manifest使程序 右键 以管理员身份运行

c#通过app.manifest使程序以管理员身份运行 时间:2013-06-27 22:47来源:网络收集本站整理 作者:jtydl 点击: 1175 次微软在Windows Vista开始引入了UAC&#xff08;用户帐户控制&#xff09;新技术&#xff08;点击这儿了解什么是UAC&#xff09;。当程序执行时需要权限的话&am…