奶蛙的参考来自 Milky Frog 网站。这次做成独立的中立兵种:体型大、占两格,攻击时抱着肚子大笑,伤害覆盖自身两格周围的敌人。本地 VCMI 和 Three.js 战场模拟器都已经接入第 37 版模型与动画。外形仍是制作稿,接入和测试通过不代表用户已经认可这版长相。

下巴与脖子(10 月 5 日,第 37 版)

第 34 版接入后,用户指出下巴奇怪,随后又指出头和肚子之间的侧面多出一块。这两次反馈对应同一段网格:第一轮只收了正面下颌,侧面的旧凸起仍然保留。第 37 版把修正扩展到脖子整个前半圈,再平滑这一圈的过渡,保留嘴唇、眼睛和大笑口腔的形状。

第 34 版侧面:下颌下方的凸起与材质分界,实际 Blender 渲染

第 37 版侧面:去掉中间凸台后的连续轮廓,实际 Blender 渲染

这里还存在一道明显的材质分界,现在改成连续的肤色过渡。首次为 Three.js 烘焙这层颜色时,闲置材质槽误把原纹理当作写入目标,导致循环依赖和黑色身体。浏览器检查发现后撤回了错误资源;工具先清除复制场景中的闲置材质槽,再烘焙,恢复了身体颜色。这项修复也已进入公开代码。

首发版本与未交付尝试的历史记录

本地 VCMI 和 Three.js 都已经接入第 34 版。 10 月 5 日后续修正: 当前为第 37 版。下面保留首发静帧;第 35、36 版的局部下颌修正没有作为最终版本交付。

第 34 版待机,历史 Blender 静帧

第 34 版大笑,历史 Blender 静帧

失败的烘焙导出:身体变黑,已撤回并修复

首发第 34 版的测试记录(保留历史数值):实战中,6 只奶蛙一次大笑消灭两队各 20 只行尸,日志记录合计 600 点实际损伤,随后完成了整场战斗。

奶蛙待机,实际高清 Blender 静帧,并非概念图

奶蛙大笑,实际高清 Blender 静帧

眼睛和嘴巴

第一轮从站立参考生成模型,再把嘴巴改成大笑。用户指出嘴巴吓人,后来又指出眼睛和嘴型都不像。第二次 Meshy 输入换成官网视频里的大笑帧,笑口的轮廓更接近参考,但牙齿被生成成一整条白色薄片,模型还把抬起的后脚误读成了尾状突起。

Astra 编写 Blender 工具,拆掉旧牙齿和口腔,重建上排牙齿、嘴内表面及舌头,再用形态键连接闭嘴与大笑。直接压缩原来的高密度面部网格,会在嘴角和脸颊挤出褶皱;重建面部拓扑并分别平滑两种表情后,才消掉这些大褶皱。

失败的第 30 版:眼球外凸,嘴巴仍张着

失败的第 30 版大笑:上排牙齿露在上唇外面

随后把眼球往脸里埋,又遮掉了一部分瞳孔。现在的绿色眼睛改为贴合脸部的浅曲面,待机嘴巴收成细缝,牙齿按修正后的上唇重新定位。只检查闭嘴和张嘴两个端点还不够:中间帧曾出现笑眼悬空、牙齿太晚露出的情况。第 34 版让笑眼随脸部形变,牙齿也跟着上唇移动。

张嘴过渡,实际高清 Blender 静帧

Meshy 提供带贴图的基础网格;Astra 负责这些局部重建、骨架与脚部 IK、大笑和行走等动作,以及导出和接入工具。这里仍然用了 Meshy,两次任务各消耗 30 credits。

两边的实际效果

Three.js 直接播放带骨骼和形态键的 GLB,包含待机、行走、大笑攻击、受击、防御、死亡和胜利七个动作。选择奶蛙后,模型、双格占位和放大的拾取范围一起加载;浏览器中检查了待机、大笑和行走,没有页面异常。

Three.js 模拟器中的实际大笑动画截图

VCMI 使用同一套 3D 场景渲染的序列帧:137 张独立战斗帧,打包为 1× 与 2× 资源,方向攻击和环击组复用大笑动作。还附有固定地面投影阴影、待机选中轮廓、兵种缩略图,以及由 3D 待机动作导出的地图动画。没有修改 VCMI 源码,也没有覆盖城堡和墓园兵种。

VCMI 测试战斗中的大笑攻击,实际游戏窗口截图

属性取普通九头怪:生命 175、攻击 16、防御 18、伤害 25–45、速度 5;保留环击和不受反击。伤害由 VCMI 计算。原生规则测试检查了两格前后及共同邻格:相邻敌人各命中一次,友军与远处单位不受伤。第 37 版实战中,6 只奶蛙首次环击造成 598 点实际损伤,消灭相邻两队中的 39 只行尸;后续攻击清理剩余敌人,整场战斗正常结束。

本地测试地图是 milky-frog-check.vmap。模拟器在兵种列表中选择“奶蛙”,也可以用动作预览查看大笑。模型和完整模组保留在本地;公开的 战场模拟器代码包含双格自定义兵种、环击机制声明和本地兵种包加载支持。