Godot 4 零关键帧实现实时物理驱动的黑触手生物
#ElevenLabsAmbassador 【零帧手绘动画】这个黑色的东西,完全是靠代码驱动的。它自己选择用触手抓哪里,伸长、抓住、松开。地板、墙壁、天花板,都能这样爬来爬去。
没有关键帧。没有机器学习。全部是代码和实时物理。
▼ 把这条推文原样粘贴给 AI 智能体(比如 Claude Code),就能做出同样的生物👇 ―――――――――― 🤖 面向智能体的技术笔记 ―――――――――― ■ 要做的东西 黑色液体触手生物。不靠腿部 IK,只靠“抓握点”移动,用同一套逻辑处理地面、岩石、台阶、墙壁、天花板和翻越角落。环境:Godot 4(GDScript)。
其他引擎思路相同。■ 1. 抓握点 ・在地形/墙壁/天花板/岩石表面散布候选点,用泊松盘采样(间距约 0.27m)抽稀 ・岩石等形状复杂的物体,从外向中心发射射线,吸附到碰撞表面 ・丢弃埋在其他物体里的点 ・用空间哈希快速搜索“附近的抓握点” ■ 2. 抓握点的选择方式(每帧评分) 对可达范围(约 1.1m)内的抓握点按以下项目打分,从高分到低分,选择从身体到该点的射线不被遮挡的点 ・沿表面的距离接近理想值(约 0.72m,触手越多越短,40 根时为 0.46m) ・位于想要前进的方向 ・表面法线朝向身体 ・远离已经抓住的点(触手不会挤在一处) ■ 3. 松开规则 ・伸得过长(超过长度上限的 92%)→ 必须松开 ・位于身体后方,且其他触手已抓稳足够数量 → 可以松开 ・保持抓握的目标数量:8 根时地面 4 根、天花板 5 根。触手增多时为 6→9→12→16 根(对应 12/18/26/40 根时)。
空中数量更少 ■ 4. 身体运动 ・身体是一个质点。实际承受的重力 = 重力 ×(1 − 支撑率)。支撑率根据抓握数量在 0~1 之间确定 ・抓握时,将身体拉向最近表面的固定距离(约 0.24m,触手越多越大),并沿该表面趋近目标速度 ・朝墙壁前进时,把向前压入的分量转换为“沿表面向上”→ 自动爬墙 ・抓住的触手视为“只有长度上限的绳索”(可自由缩短,伸长有上限)→ 自然产生悬挂和钟摆效果 ・数据流单向:身体 → 抓握点选择 → 触手状态 → 绳索计算(反向影响会导致失控) ■ 5. 触手 ・状态有 4 种:体内(隐藏)/伸出/抓握/收回(IDLE / REACH / GRIP / RELEASE) ・伸出:在贝塞尔曲线上按弧长等距排列点,从根部向尖端延伸(点不会堆积,因此不会抖动) ・抓握:固定尖端,其余部分用 Verlet 绳索求解。
同时轻微拉回原有弧线形状 ・收回:一边卷收绳索,一边融入身体消失 ・绘制前用 Catmull-Rom 将 11 个点插值为 16 段 → 形成无缝平滑的管状 ■ 6. 液体外观(这是最重要的部分) ・不用网格,而是通过光线步进 SDF 绘制 ・将身体的 4 个球 + 触手的胶囊列 + 水滴 + 液丝,用 smooth min(smin)融合成一个液体 → 触手从身体“抽出”,在抓握处液体溅开,松开时拉丝并断裂 ・单根触手内部相邻胶囊之间使用普通 min(若用 smooth min,每个接缝都会膨胀,看起来像关节) ・黑色高光泽:卡通风格的天空/地面反射 + 硬高光 + 斜看时的油膜彩虹色 + 紫色轮廓光 + 描边 ・提速: ・不透明但用透明管线(ALPHA=1)绘制(若按不透明处理,深度预通道会让光线步进执行两次) ・按触手用边界球剔除 ・阴影用专用简化着色器单独生成 ■ 7. 成长(喝黑水) ・将 3 根以上触手伸入水洼 → 液块沿触手流向身体 → 水洼缩小 → 身体膨胀 → 一次性长出新触手 ・触手数量 8 → 12 → 18 → 26 → 40(油桶) ・触手越多,身体抬得越高,抓握点越靠近身体(触手斜向下伸)→ 整体占地面积不会持续扩大 ・触手越多越细、越快 ■ 8. 精彩动作 ・向天花板射出一根长触手,卷收绳索拉起身体 ・用一根触手悬挂,像钟摆一样跃过缝隙 ・油桶:只抓住边缘,随油面一起下沉,喝干后浮到边缘上方并跳出 ―――――――――― 演示视频中的旁白和 BGM 全部由 @ElevenLabs 的 Eleven v4 生成。@ElevenCreative #ElevenCreativeAmbassador