[转]使用OgreMax导出自定义数据
http://ranjiao.com/blog/index.php/2009/ogremax%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C/
自定义数据
使用OgreMax很重要的一点就是导出自定义数据。要做到这一点首先需要自己写一个xml文档来说明自定义数据的类型,在OgreMax文档的"Custom User Data Types"页面中有很详细的例子,比如下面是我正在做的项目中截出来的一段:
<userDataTypes>
<class name="charactor" displayName="角色 " usage="private">
<data name="name" displayName="名称 " type="string"/>
<data name="wayname" displayName="路径名 " type="string"/>
<data name="meshname" displayName="模型名称 " type="string"/>
<data name="common_skeleton" displayName="公用骨骼 " type="bool" defaultValue="true"/>
</class>
</userDataTypes>
在OgreMax->Object Settings->User Data中载入以后就可以在type中选择"角色"类型了,并且会按照xml中定义的数据显示。
导出以后在.scene文件中会有类似如下的xml块:
<![CDATA[
<player>
<name>DefaultPlayer</name>
<wayname></wayname>
<common_skeleton>true</common_skeleton>
<meshname>robot</meshname>
</player>
]]>
上面这一段CDATA可能包含在一个Entity或者Node节点中,具体取决与你在OgreMax中的设置。
物体属性设置
前面也提到了,在OgreMax->Object Settings中可以对导出物体的属性进行设置。这里介绍一下其中比较重要的一些选项。
General
- Type 这一项决定了导出物体在.scene文件中的类型。最常用的是Entity/Mesh,这个类型在导出以后会生成一个node以及挂载在该node上面的entity,同时会把3ds
max中的该物体导出为一个.mesh文件。然后就比较常用的就是Empty,这种类型会导出为一个没有挂任何东西的node。比如说我用一个box来代表NPC出现的位置,那么这个box就可以设置为Empty类型。 - Rendering 在这里设置物体的可见性、渲染顺序、shader参数等等
Node Animation
在这里设置物体的Node动画,即位置、旋转、缩放上的动画。物体模型本身变化的动画在Mesh Animation中设置。具体的用法还没有仔细研究。
User Data
自己游戏所需要的自定义数据就在这里设置了。点Configure…按钮添加上面所说的userdatatypes.xml文件以后,User Data Class中就会出现自定义的数据类型。这样就可以直接把3ds
max作为一个关卡编辑器来使用了。虽说还是没有专门的编辑器那么方便,不过大多数情况下还是够用了。
Mesh
Mesh Name和Skeleton Name可以制定输出的模型和骨骼的文件名,如果不指定的话则会以3ds max中物体的名字命名。
Mesh Animation
这里用来设置顶点动画或骨骼动画。可以把整个场景中物体的任意某一段动画制定某个名字以供程序调用。点击Add..会弹出Animation Settings窗口。通常其中的Track类型已经设置好了,骨骼动画是Physicue, 定点动画是Morph。只需要制定动作的起始帧号就可以了。要注意的是一个场景中某个物体的骨骼动画只能导出为一个skeleton文件,如果你需要把不同的动作导出为不同的动画的话,需要把骨骼动画保存为不同的max文件然后飞别导出。
自定义文件的读取
OgreMax提供了从3ds max中导出为.scene文件的机制,然是我们还是缺一个读取它的程序。虽然OgreMax中自带了一个Viewer程序,但是要处理自定义数据显然还是得自己动手写一个。这里可以参考Ogre
Wiki中的一个.scene文件读取程序的例子,在它的基础上进行修改:
http://www.ogre3d.org/wiki/index.php/New_DotScene_Loader
但是这个程序在很多地方都只是写了一个函数名而没有实现,并且对场景文件的处理和OgreMax导出的格式还是有所区别,需要自己进行大量修改。这里附上我自己的场景读取程序:SceneLoader
To obtain the "extra" data stored in objects call the OgreMaxScene::GetObjectExtraData() method, passing in the object. A pointer to the extra data is returned. The pointer does not need to be deleted. It will, however, be deleted if the OgreMaxScene that loaded it is deleted.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构