代码之家  ›  专栏  ›  技术社区  ›  Jonas Byström

将maya ascii导入游戏

  •  3
  • Jonas Byström  · 技术社区  · 16 年前

    我目前正在为我的独立游戏创建一个基于导入的管道,使用maya ascii.ma作为源格式,使用我自己的物理和图形格式作为输出。我将在maya中保留类似“运动范围”(Range of Motion)属性的内容,例如铰链关节。其他需要大量调整的参数类型最终会出现在单独的源文件中(对于质量、弹簧常数、物理引擎的强度等内容,可能是.ini)。

    因此,输入是一个.ma和一个.ini,输出是一个.physical和几个.mesh文件(每个几何体/材质一个.mesh文件)。

    我可能还会使用python 3.1重新格式化数据,并且我已经找到了一些lgpl 2.1代码来读取基本的maya ascii。我可能还会在开发期间使用python来启动平台。游戏是用C++开发的。

    在这一切中有什么你会反对的吗?对可能存在缺陷的事物进行快速总结:

    • 基于导入的管道(不基于导出)?
    • 玛雅(不是3DS)?
    • maya ascii.ma(不是.mb)?
    • .ini(不是.xml)?
    • 在maya中分离运动属性和在.ini中分离“怪异调整”属性(不是全部在maya中)?
    • 用于构建数据的Python 3.1(不是嵌入式C++)?

    编辑:如果您对如何实现物理/图形导入/导出工具链有更好的建议,我会感谢您的输入。

    3 回复  |  直到 13 年前
        1
  •  4
  •   Tom B Jonas Byström    13 年前

    如果你真的想这样做,你应该知道一些事情。最主要的一点是,这可能比你想象的更麻烦。其他一些是:

    • maya.ma(至少在当前v.2010之前)是由mel建立的。MEL是图灵完备的,但是用节点描述分层场景的方式比__code__更直接。
    • 尽早添加错误处理,否则您稍后会后悔。
    • 您必须处理许多不同的节点,其中转换是迄今为止最令人讨厌的节点。其他类型包括网格、材质(许多不同类型)、着色引擎和文件(如纹理)。
    • .ma只描述形状和调整;但很少定义原始顶点。我选择在.ma中保留一个小的__export_脚本,以避免以与maya完全相同的方式生成所有原语。事后看来,这是正确的方法。否则,你必须能够做像
      1. _156;创建球体__,
      2. _156;将半径为this和that的软选择从这里移动到那里_157;,和
      3. _156;move vertex 252 xyz units_(隐式定义所有顶点)。
    • maya为网格定义多边形;您可能希望 RT到三角形。
    • 在特定类型的节点上存在的所有参数都是显式或隐式定义的。您必须知道它们的默认值(隐式定义时),
    • 基本上,对象是由变换、网格和原语定义的。变换是网格的父级。转换包含缩放、旋转、平移、轴平移,还有一些。网格链接到原语,反之亦然。原始体有一个类型(__polycube_)和尺寸(__width,height,depth_157;)。
    • 节点可能具有_多重继承_。例如,多次实例化的网格具有单个网格(和单个基本体),但有多个父对象(转换)。
    • 节点转换的计算方式与此类似(请参见 Maya xform doc 更多信息):
    
    vrt = getattr("rpt")
    rt = mat4.translation(vrt)
    ...
    m = t * rt * rpi * r * ar * rp * st * spi * sh * s * sp
    
    • 我围绕物理构建我的引擎,所以游戏引擎希望网格放置在物理形状上,但是当建模时,我希望相反。这是为了让它在未来的应用中保持通用性(无物理网格)。这个小小的决定使我在转变中感到严重的悲痛。线性代数得到了一个提纲。在缩放、旋转、平移和剪切方面的问题;你说的,我有过。
    • 我的导入工具建立在 cgkit _s maya解析器。谢谢马提亚斯·巴斯!
    • 如果你想做类似的事情,我强烈建议你偷看 my converter 在写你自己的之前。这个__small_项目花了我三个月的时间才达到基本工作条件。
        2
  •  1
  •   lvh    16 年前

    作为一种通用的序列化格式,它既具有人类可读性,又具有人类可写性,具有出色的Python支持(而且, 任何 语言支持),您可能会考虑在ini文件或XML上使用yaml或json。

    如果您从未手工生成文件,那么XML在您的情况下是可以接受的。

    JSON和YAML的一个优点是打字:这两种格式都被解析为python列表、字典、float、ints…基本上:健全的python类型。

    此外,除非您确定将要使用的每个库都适用于3.1,否则由于库的可用性问题,您可能需要考虑使用2.x。

        3
  •  1
  •   user238043    15 年前

    您应该考虑使用基于导出的管道或标准化文件格式(如obj或collada),而不是重新实现.ma解析器并复制解释它所需的所有maya内部结构。

    .ma/.mb格式不打算被除maya本身以外的任何程序读取,因此,Autodesk不会努力使此过程变得简单。要100%正确地分析它,您需要实现整个MEL脚本语言。

    我看到的所有基于maya的管道,要么首先将内容导出为标准文件格式,要么在maya中运行mel脚本以使用mel节点接口转储内容。

    注意,在不加载GUI的情况下,可以在“无头”模式下运行maya,其中加载场景、执行MEL脚本并存在。因此,在自动化构建系统中使用它没有问题。