# 动画导出 ### 通用准则 动画以`.a2d`格式存储。要从 3ds Max 导出动画,请执行以下步骤: 1. **确保可见性:** 所有包含骨骼的图层以及骨骼本身都必须被取消隐藏和可见。 2. **导出设置**:在导出设置中指定动画的开始帧和结束帧。**自动帧检测不起作用**。 3. **添加Node轨道:** 在**Track View > Dope Sheet**中,添加一条Note Track到任意动画骨骼。 ```{seealso} 有关添加和编辑 Note Tracks 的更多信息,请参阅 [添加 Note Track](https://help.autodesk.com/view/3DSMAX/2024/ENU/?guid=GUID-658E12E7-CE32-48BF-A3CE-A289356F48A3). ``` 向 Note Track 添加两个键: - 在第 0 帧:设置带有 '`start`' 标签的关键帧。 - 在最后一帧:设置带有 '`end`' 标签的键。 这些键对应于单元的 '`animtree.blk`' 文件中的 '`key_start`' 和 '`key_end`' 参数。您可以根据需要更改标签。 ```{seealso} For more information, see [.blk File Format](../../dagor-tools/blk/blk.md). ``` 4. **骨骼一致性:** 目标模型(将应用动画的模型)和导出到 '`.a2d`' 文件的骨骼之间的骨骼数量及其链接顺序必须匹配。 ### 项目之间的资产转移 在项目之间传输资源时,可能会出现 **着色器差异** ,从而导致错误。要解决此问题,请执行以下作: - 使用“`F4`”编辑 FAR 中的“`.dag`”文件(针对工作室特定的设置进行配置)并确保着色器兼容性。 - 请注意,“`dynamic_simple`”着色器在工作室项目中普遍可用,建议在资源转移的初始阶段使用。 3ds Max 中的“自定义属性”无法在传输后进行调整。 遗憾的是,导入 '`.dag`' 文件可能会导致皮肤数据损坏。但是,您可以在 FAR 中使用 '`Alt`'+'`F4`' 修改属性。 ```{warning} 请谨慎使用语法: **语法错误不会触发警告,未保存的更改将被丢弃**。 ``` ### 限制 - 骨骼限制:每个带皮肤的节点最多支持 200 个骨骼。虽然理论上可以扩展到 255,但当前的着色器限制将限制限制为 200。 - **三角形限制:** 每个节点最多允许 65,534 个三角形。 ### 特定于项目的自定义对象属性 不同的项目可能对 **自定义对象属性** 有独特的要求 确保虚拟资产的正确生成。例如: - **Enlisted:** 每个蒙皮对象必须包含以下属性: ```text animated_node:b=yes collidable:b=no massType:t="none" ``` 省略这些属性将导致动态模型生成过程中出现一般错误。 - **CRSED:** 此类要求不适用。 ```{tip} 如果您对本节有任何疑问,请直接通过 {octicon}`mail;1.4em;sd-text-info` 直接联系作者。 ``` ### `animtree.blk`中的动画描述 动画必须在相应块的 `animtree.blk` 中描述。 对于基于 War Thunder 的项目,这涉及两个部分: 1. **AnimBlendNodeLeaf{} 模块:** ```text AnimBlendNodeLeaf{ a2d:t="animation_file.a2d" // 动画文件名 continuous{ name:t="animation_name" // 动画名称 key_start:t="start" // 开始键 key_end:t="end" // 结束键 time:r=1 // 播放时长 own_timer:b=yes eoa_irq:b=yes addMoveDirH:r=-90 // 设备移动方向 addMoveDist:r=1.33 // 每个播放时间覆盖的距离 } } ``` 2. **hub{} 模块:** ```text hub{ name:t="animation_file" // 动画名称 const:b=yes // 指示动画是否循环 } ``` 请记住,'`animtree.blk`' 也是一个可导出的资源。要在游戏中看到它,您必须执行 '`daBuild`'。 ### “`.blk`”中的动画导出描述 “`.blk`”格式的动画的导出说明: ```text file:t=some.a2d opt:b=yes // 保守优化 posEps:r=0.01 rotEps:r=0.2 sclEps:r=0.1 ``` 对于 `.folder.blk` 文件: ```text virtual_res_blk{ find:t="^(.*)\.a2d$" className:t="a2d" contents{ opt:b=yes // 保守优化 posEps:r=0.01 rotEps:r=0.2 sclEps:r=0.1 } } ```