Files
agame/.workbuddy-ai/memory/2026-10-02.md
T
2026-10-02 09:04:37 +08:00

1.3 KiB
Raw Blame History

2026-10-02

审查:Godot 4.7「SubViewport 面部手绘 + 骨骼驱动」方案

用户贴来一份第三方方案(SubViewport 当可绘制面部贴图 + SkeletonModifier3D 把骨骼 Z 转成 shader 参数),问可行性。只做评审,未改任何代码。

结论:原理可行(SubViewport-as-texture + shader 混合是标准做法),但原文代码有 4 处硬伤:

  1. shader render_mode ... skip_vertex_transform 却没写 vertex() 手动变换 → 模型位置错。删掉该 render_mode。
  2. PaintSurface._input 在后台 SubViewport 里收不到鼠标事件(Viewport 之间不派发输入)→ 必须放进 SubViewportContainer,或手动 push_input。
  3. SkeletonModifier3D 没有 skeleton 属性,只有 get_skeleton()(已查 4.5 文档确认)。
  4. save_paint 没 await RenderingServer.frame_post_draw → 存到空帧。

标定类问题:get_bone_pose_position() 是相对父骨的姿态,Z 轴受父骨朝向影响,GLTF 导入后与 Blender 不一致,z_min/z_max 必须实测标定;face_index 只做了亮度乘,没真正切换表情图层。

与本项目相关的判断:角色是 character-male-e.glb,需先确认有独立面部材质槽 + 展平 UV;多人下 SubViewport/材质必须每实例一份,远端玩家的画要按 PNG 字节流同步。