• v0.2.1 14ee5f7ec9

    zijunchiang released this 2026-09-17 03:59:30 +08:00 | 13 commits to main since this release

    ⚠️ 本版已被 v0.2.2 取代(建议直接用 v0.2.2):
    本版的 OpenDance.exe 在 Windows「右键 → 属性 → 详细信息」里显示的
    文件版本 / 产品版本是 0.1.0,而产物名与 tag 是 v0.2.1 —— 元数据不可核对。
    根因是 export_presets.cfg 的 application/file_version /
    application/product_version 被硬编码成 0.1.0 后无人更新;
    v0.2.2 起由 sync-export-version.sh 在导出前同步、由 check-pe-version.sh
    直接读产物 exe 的 PE 版本资源复核。

    OpenDance Studio -- Windows 客户端 v0.2.1

    场景包围盒修复 + 21 项"真机等价"无头测试 + 版本号一致性强制校验。
    本版取代 v0.2.0(v0.2.0 存在下述缺陷)。

    契约快照不变:rest-api 0.5.0 / websocket-keypoints 0.2.0 / data-models 0.7.0 /
    database 0.4.0(与 opendance-web / opendance-android 逐字节一致)。

    一、修复:场景包围盒在"未入树"时用 global_transform

    SceneRuntime._compute_aabb() 原先用 MeshInstance3D.global_transform 计算包围盒,
    而它在 _assemble() 里被调用 —— 那时运行时节点还没被加入场景树:

    • Godot 会打一行错误日志(真机每次载入场景都刷一条,与"日志里不应出现 ERROR"的
      排查约定冲突):

      ERROR: Condition "!is_inside_tree()" is true. Returning: Transform3D()
      
    • 树外的 global_transform 返回单位变换,于是算出来的只是各网格的局部 AABB。
      包围盒用于①重力/风 Area3D 的碰撞盒尺寸与位置 ②兜底地面的尺寸与位置 ——
      对于把网格摆在非原点位置的场景(导出 GLB 的常见情况),区域会偏小或偏位,
      风力/重力可能作用不到物体上。

    修复:改为从根节点往下累乘 Node3D.transform,不依赖是否入树;
    运行时挂在单位变换的父节点下时,结果与旧语义一致。

    二、新增 21 项无头"真机等价"测试(不需要设备)

    场景(tests/test_scene_config.gd)

    在代码里手写一个合法 GLB(三角形:POSITION 3×VEC3 + indices 3×u16 + BIN chunk)
    落盘后真实加载,核对:

    • 真实 GLB 加载 warnings 为空、不使用兜底地面;
    • colliders 三种取值:mesh → 按网格生成;auto 命中 *_col → 生成;
      auto 未命中 → 兜底地面并标记;none → 不生成也不兜底;
    • 重力 Area3D 的 gravity / gravity_direction 与服务端配置一致,
      且用 SPACE_OVERRIDE_REPLACE(不改全局 ProjectSettings);
    • 风力按基础风向量生效(与 WIND_FORCE_SCALE 对齐),describe() 摘要可核对;
    • 带位移网格(节点 translation [10,0,0])时,重力区域碰撞盒与兜底地面
      都跟着位移(x≈10)—— 即上述缺陷的回归测试。

    保活的时间维度(tests/test_pose_server.gd)

    用真实的 15 秒静默超时跑一次对照:

    • 只发应用层 ping、不发任何关键点帧的客户端,17 秒后仍保持连接
      —— 这正是"画面里没人就掉线、然后疯狂重连"的根因对照(契约 §1.1 的应用层心跳);
    • 连上后什么都不发的客户端被 close(1001, "timeout") 断开(超时机制仍有效,
      且按契约 §7 对端不会重连)。

    三、新增版本号一致性强制校验

    build/check-version.sh:强制 project.godot 的 application/config/version
    (「关于」清单与导出 .pck 的唯一来源)与 project.yaml、发布版本号三者一致;
    已接入 build/package-release.sh(打包前)与 build/verify.sh(第 0/4 步),
    并做过反向验证(把 project.godot 改错后校验立刻失败)。
    此前没有任何机制保证这两个文件同步 —— 界面显示的版本可能与产物名不一致。

    本版三者一致为 0.2.1,并已用 strings 核对导出 .pck 内的版本号同为 0.2.1。

    校验

    • build/verify.sh 四步全通过:版本一致性 → 脚本编译 → 751 项断言(原 720)→
      180 帧启动无运行时错误;
    • 导出 OpenDance.exe 106,605 KiB(PE 头 MZ)+ OpenDance.pck 141 KiB;
    • 整包 7z t 完整性测试通过、解压后 OpenDance.exe + OpenDance.pck 同目录。

    交付物与校验和

    opendance-windows-v0.2.1.zip     26,627,191 字节(LZMA 压缩,单个完整包)
      ├── OpenDance.exe
      ├── OpenDance.pck
      ├── THIRD_PARTY.md
      ├── README.txt / README.md
      └── contracts/                 契约快照(与另两端逐字节一致)
    SHA256SUMS                       裸文件名,下载目录内 sha256sum -c 直接可用
    

    opendance-windows-v0.2.1.zip sha256:
    d49885327047f5a52de6c732431ea080cd1a030ae1c581a8bc0ec0d99bfb792c

    ⚠️ 解压要求:本包用 LZMA 压缩(发布时 Gitea 站点 IIS 的
    maxAllowedContentLength 仍是默认的 30,000,000 字节,37 MB 的 deflate 整包会返回
    HTTP 413)。Windows 10 的资源管理器不支持 LZMA(method 14) 的 zip,请用
    7-Zip / WinRAR / PeaZip 解压
    ;解压后 OpenDance.exe 与 OpenDance.pck
    必须在同一目录。若运维已把 IIS 上限放开到 256 MB,可用
    bash build/package-release.sh 0.2.1 得到可双击解压的 deflate 包。

    下载与安装

    sha256sum -c SHA256SUMS
    7z x opendance-windows-v0.2.1.zip
    # 进入目录后双击 OpenDance.exe
    
    Downloads