KanaWorks发布零帧蜘蛛爬行代码 可跨墙面天花板实时移动
这是一只没有任何动画帧数据的蜘蛛🕷 从地面到墙壁、再到天花板,甚至绕过边缘爬到背面,全部都是通过代码实时驱动的。
把这条帖子直接交给 AI 智能体(Claude Code / Codex 等),应该就能复现同样的动作。以下是给智能体的技术备忘👇
――――――――――
请让一只 8 条腿的蜘蛛,在零关键帧、不使用机器学习、仅靠射线检测的条件下行走。它必须能不间断地在地面⇄墙壁⇄天花板⇄边缘背面之间移动。引擎不限(原作使用 Godot 4 / GDScript)。
■ 每帧处理顺序
1. 将输入方向投影到当前所在平面的切平面上,并绕平面法线旋转前进方向(转向速度设上限)
2. 沿平面推进导航用的锚点
3. 推进行走相位,对每条腿进行迈步判定和着地点搜索
4. 根据腿部接地状态确定身体的位置和姿态(用弹簧跟随)
5. 如果身体陷入地形,则向外推出
6. 对每条腿进行 IK 求解,更新视觉表现
■ 1. 锚点(沿平面移动)
- 让锚点带有一个点和一个平面法线。移动后,从法线方向的上下两侧发射射线,将其重新投影到平面上
- 如果法线变化较小,则直接更新;如果变化较大,则视为“平面切换”
- 切换时,先通过旧法线→新法线的旋转(四元数)旋转前进方向,再投影到新平面上(平行移动)。这样即使在天花板上,前进方向也不会反转
- 凹角(墙壁):沿前进方向向前发射射线,如果命中法线差异较大的平面,则将其作为“下一个平面”
- 凸角(边缘):如果稍前方的正下方射线落空,则从边缘下方向后发射射线,找到背面的平面
■ 2. 90 度换面时“前脚先着地”(最重要)
- 即使找到了下一个平面,锚点也不会立即切换。在角前减速,在头部与墙壁之间留出约 8cm 后停下
- 前两条腿不等待行走相位,而是像探墙一样伸出“试探足”。着地点是将理想着地点投影到新平面上,再沿平面前伸 14cm 的位置。比平时抬得更高,摆动期间不改变目标
- 前脚接触新平面后,锚点才切换。其余腿也只向切换后的平面迈出一步(不回到原平面)
- 身体朝向由已接地腿所在平面的法线加权平均决定。越靠近锚点所在平面,权重越大(避免薄板正反面相互抵消)
- 摆动中的腿在着地前,将离地点视为支撑点。否则身体会先于腿转动,头撞向墙壁
- 作为故障保护,如果 1.4 秒后前脚仍未着地,则强制切换
■ 3. 步态
- 左右交替的 4 腿组(L1 R2 L3 R4 / R1 L2 R3 L4,相位差 0.5)。从前到后每条腿相位略微错开,形成轻微波浪
- 行走频率随速度成比例提高(约 1.4Hz + 1.15×速度,上限 4.6Hz)。摆动期比例从低速 36% 到高速 50%。步幅 = 速度 ÷ 频率
- 迈步条件满足以下任一:相位循环一周时偏离理想位置 3cm 以上/腿伸展到触及范围的 98%/停止时偏离 22cm 以上
- 仅当相邻腿(左右对和前后)全部接地时才抬起(防止支撑崩溃)
- 着地目标 = 基准位置 + 速度 ×(剩余摆动时间 + 支撑时间的一半)。这样足尖会从身体下方“+半步→-半步”通过
- 摆动轨迹用 smoothstep 插值,并沿离地面与着地面法线、身体上方向合成的方向,以 sin 曲线抬起。上台阶时抬高幅度更大
- 踩在移动箱子上的足尖,按箱子的局部坐标保持并一起移动
■ 4. 落脚点搜索(依次尝试 3 条射线)
① 腿根部→目标点(稍延长):命中墙壁即为凹角落脚点
② 从目标点上方朝向身体下方:通常地面
③ 从边缘下方向身体侧水平发射:凸角背面的平面
如果都未命中,则将足尖收回到根部下方。
■ 5. 身体
- 上方向 = 支撑面法线 35% + 足尖平面法线 65%。足尖平面法线是将足尖绕身体环状排列,用 Newell 法求得
- 位置按“锚点 + 法线×体高”与“足尖重心 + 足尖平面法线×体高”以 35:65 混合,用接近临界阻尼的弹簧跟随(若仅由足尖决定,会出现身体等腿、腿等身体的死锁)
- 每次着地,向高度方向的弹簧施加向下的冲量(略微欠阻尼,使其轻微下沉)
- 将重心移向离地前腿的对侧,即支撑腿一侧(最大 5cm)
- 因惯性倾斜:加速时向后,减速时向前,转向时向外侧
- 在头、头胸部、腹部放置球体,每帧将与地形重叠的部分沿法线方向推出
■ 6. 腿部 IK 与二次运动
- 基节(水平向外)→腿节·胫节的 2 骨骼 IK(膝盖朝向外上方)→跗节。跗节从脚踝向足尖,沿上、外、接地面法线合成的方向垂下
- 腹部、触肢、眉状毛束用 Verlet 弹簧链驱动。加减速时滞后跟随,着地时晃动
――――――――――
关键在于“不是头部,而是前脚先接触新平面”。只要守住这一点,立刻就会有生物的感觉。