1.3 KiB
1.3 KiB
2026-10-02
审查:Godot 4.7「SubViewport 面部手绘 + 骨骼驱动」方案
用户贴来一份第三方方案(SubViewport 当可绘制面部贴图 + SkeletonModifier3D 把骨骼 Z 转成 shader 参数),问可行性。只做评审,未改任何代码。
结论:原理可行(SubViewport-as-texture + shader 混合是标准做法),但原文代码有 4 处硬伤:
- shader
render_mode ... skip_vertex_transform却没写 vertex() 手动变换 → 模型位置错。删掉该 render_mode。 PaintSurface._input在后台 SubViewport 里收不到鼠标事件(Viewport 之间不派发输入)→ 必须放进SubViewportContainer,或手动push_input。SkeletonModifier3D没有skeleton属性,只有get_skeleton()(已查 4.5 文档确认)。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 字节流同步。