【问题标题】:Importing Maya ASCII to game将 Maya ASCII 导入游戏
【发布时间】:2010-11-12 11:08:50
【问题描述】:

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

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

我也可能会使用 Python 3.1 重新格式化数据,并且我已经找到了一些读取基本 Maya ASCII 的 LGPL 2.1 代码。我可能还会在开发过程中使用 Python 来启动平台。游戏是用 C++ 开发的。

您有什么建议反对的吗?可能存在缺陷的事情的快速总结:

  • 基于导入的管道(不基于导出)?
  • 玛雅(不是 3DS)?
  • Maya ASCII .ma(不是 .mb)?
  • .ini(不是 .xml)?
  • 分离 Maya 中的运动属性和 .ini 中的“freak-tweak”属性(并非全部在 Maya 中)?
  • 用于构建数据的 Python 3.1(非嵌入式 C++)?

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

【问题讨论】:

    标签: import pipeline maya ini


    【解决方案1】:

    作为一种人类可读和可写的通用序列化格式,具有出色的 Python 支持(而且,确实,任何语言支持),您可能需要考虑在 ini 文件上使用 YAML 或 JSON或 XML。

    如果您从不手动生成文件,那么您的情况可以接受 XML。

    JSON 和 YAML 的优点之一是打字:这两种格式都被解析为 Python 列表、字典、浮点数、整数......基本上:理智的 Python 类型。

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

    【讨论】:

    • .ini 文件在 configparser 模块中得到很好的支持,参数直接解析为 Python 类型。我只会使用尽可能少的导入 Python 模块,而且我从来没有遇到过任何问题,只要使用 2to3.py,所以我的概念证明中,我会说这些风险也被消除了。跨度>
    【解决方案2】:

    如果你真的想这样做,你应该注意一些事情。主要是它可能比你最初预期的更麻烦。其他一些是:

    • Maya .ma(至少在当前 v.2010 之前)由 mel 构建。 Mel 是图灵完备的,但用节点来描述分层场景的方式比“代码”要直接得多。
    • 尽早添加错误处理,否则您会后悔的。
    • 您必须处理许多不同的节点,其中的转换是迄今为止最令人讨厌的。其他类型包括网格、材质(许多不同的类型)、“着色器引擎”和文件(例如纹理)。
    • .ma 仅描述形状和调整;但很少定义原始顶点。我选择在 .ma 中保留一个小的“导出”脚本,以避免必须以与 Maya 完全相同的方式生成所有图元。事后看来,这是正确的方法。否则你必须能够做类似的事情
      1. “创建球体”,
      2. “将半径为 this-and-that 的软选择从这里移动到那里”,以及
      3. “移动顶点 252 xyz 单位”(隐式定义所有顶点)。
    • Maya 为网格定义多边形;你可能想开会 rt 到三角形。
    • 存在于特定类型节点上的所有参数要么显式定义要么隐式定义。您必须知道它们的默认值(隐式定义时),
    • 基本上,对象由变换、网格和图元定义。变换是网格的父级。变换包含缩放、旋转、平移、枢轴平移等等。网格链接到图元,反之亦然。图元具有类型(“polyCube”)和尺寸(“宽度、高度、深度”)。
    • 节点可能具有“多重继承”。例如,多次实例化的网格有一个网格(和一个图元),但有多个父级(变换)。
    • 节点转换的计算方式如下(有关详细信息,请参阅Maya xform doc):
    
    vrt = getattr("rpt")
    rt = mat4.translation(vrt)
    ...
    m = t * rt * rpi * r * ar * rp * st * spi * sh * s * sp
    
    • 我围绕物理构建我的引擎,因此游戏引擎希望将网格放置在物理形状上,但在建模时我希望它相反。这是为了保持它对未来应用程序的通用性(“没有物理的网格”)。这个微小的决定让我在转型中感到非常悲痛。线性代数得到了更新。缩放、旋转、平移和剪切方面的问题;你的名字,我有它。
    • 我在 cgkit 的 Maya 解析器上构建了我的导入工具。谢谢马蒂亚斯巴斯!
    • 如果您要做类似的事情,我强烈建议您在编写自己的代码之前先查看my converter。这个“小”项目花了我三个月的时间才达到基本的工作条件。

    【讨论】:

      【解决方案3】:

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

      .ma/.mb 格式不打算由 Maya 本身以外的任何程序读取,因此 Autodesk 没有做出任何努力来简化此过程。要 100% 正确解析它,您需要实现整个 MEL 脚本语言。

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

      请注意,Maya 可以在“无头”模式下运行,它会加载场景、执行 MEL 脚本并存在,而无需加载 GUI。因此在自动构建系统中使用它没有问题。

      【讨论】:

      • 这是一项疯狂的事业,但现在已经完成(足够)我准备从中获益。
      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 2023-04-03
      • 2011-12-12
      • 2016-03-18
      • 1970-01-01
      • 2011-03-19
      • 2013-10-16
      • 2011-05-13
      相关资源
      最近更新 更多