跳到主要内容

案例二:可控制炮头的低模炮塔

炮塔没有预制动作片段,但它有游戏需要的可动结构。这个案例说明“静态模型”可以由游戏脚本控制局部节点。

炮塔原生导出并重导入后的渲染

交付结构​

Turret 地面中心,整体定位
├── Base 底座网格
└── Yaw 炮头网格与水平转轴
└── Barrel 炮管网格

实际交付300三角形、3个网格、3种材质,无骨骼与动画。GLB为22,704字节。它没有外部纹理,通过基础PBR参数表达色块外观。

Yaw 的原点位于 Blender (0,0,0.77),经标准 glTF 轴转换后对应 (0,0.77,0)。旋转 Yaw 时炮管跟随,Base 保持不动。

为什么不能简单合并所有几何​

如果把炮头、底座与炮管合并成一个无层级网格,脚本就无法直接查找 Yaw 旋转。可以重新建骨骼或拆分几何,但这增加了不必要的接入工作。

层级是功能接口的一部分。命名稳定、原点正确,比导出文件里少一个节点更重要。相同材质是否能合批,另由引擎和渲染状态决定。

制作与复现​

  1. 用圆柱和块体建立底座、炮头与炮管。
  2. 将根放在地面中心,设置炮头转轴。
  3. 保留 Base、Yaw、Barrel 的对象与父子关系。
  4. 使用基础PBR材质,保存 .blend,由原生导出器生成GLB。
  5. 在源工程与重导入GLB后分别转动Yaw,验证底座不动。
"/Applications/Blender.app/Contents/MacOS/Blender" \
-b --python examples/blender/generate_assets.py -- turret

引擎接入​

Creator 会为导入的 glTF 场景生成 Prefab。实例化后找到 Yaw,由游戏瞄准逻辑控制它。在引擎的Y-up空间,示例沿Y轴改变水平角。

const yaw = turret.getChildByName('Turret')?.getChildByName('Yaw');
yaw?.setRotationFromEuler(0, targetAngleDegrees, 0);

是否存在导入器包裹根节点应以实际 Prefab 为准。示例工程会输出节点清单,避免把猜测路径当作事实。

验收证据​

Blender源工程与原生重导入GLB后,均把Yaw旋转90°:底座世界顶点位移为0,炮管绕轴误差小于5×10⁻⁸。这是几何与层级检查,不是游戏瞄准算法验证。

炮管绕了底座中心,但我需要它绕炮头中心。
请检查Yaw原点与Barrel父子关系,给出世界坐标对比。
保留Base位置和整体尺寸,只修复层级与转轴。

下载:GLB、源工程。继续:Cocos 接入、变换。