Communitygithub.com

3D场景制作

使用Three.js(引擎/three.js)实时构建3D视频镜头,或通过Blender(引擎/blender)预渲染生成。涵盖卡通、写实和霓虹风格,支持产品与CAD模型、摄像机运动、物理效果,并确保每一帧的确定性。

3D场景制作 是什么?

该技能专注于为视频制作3D场景,提供了两种主要工作流程:基于Three.js的实时渲染层和基于Blender的预渲染底板。它支持三种视觉风格——卡通、写实和霓虹——每种风格都提供了具体的实现指南,包括光照设置、材质参数和后处理效果。此外,技能还涵盖了从GLTF加载3D模型、处理动画GLB剪辑、让HTML标签跟随3D点、处理CAD网格(包括非索引化和顶点法线计算)、烘焙物理模拟,以及实现口型同步角色等高级功能。对于渲染输出,技能提供了检查方法,如渲染关键帧静帧、Three.js帧的MD5校验,以及在生产日志中记录渲染时间,确保输出结果的质量和可重复性。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/murathany7/reel-studio/tree/HEAD/.agents/skills/scene-3d

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

预览

来自技能 README

文档

3D场景制作 是做什么的?

Three.js(实时层)

  • 使用/engines/three.js中的threeLayer(el, { update(t), background, fov })。为three添加import map(参见examples/engines-demo/index.html)。
  • update(t)根据t设置所有变换。摄像机运动:使用GSAP动画在普通对象上进行关键帧设置(tl.to(cam, { x: 4, z: 8, duration: 2 }, 3)),然后在update中将其复制到camera.position。
  • 模型:使用three/addons/loaders/GLTFLoader.js中的GLTFLoader(将"three/addons/"映射到import map中的"/core/node_modules/three/examples/jsm/")。加载过程需包裹在Studio.wait(...)中。模型文件放在品牌的assets/models/或制作项目的composition/目录下。
  • 外观(looks/README.md)决定渲染风格;同一模型可以应用于以下任一方式:
    • 卡通风格(looks/toon-3d):toon(color, { steps }) + outline(mesh, { thickness })。硬光:一个DirectionalLight + 低强度的AmbientLight。
    • 写实风格(looks/photoreal):await realistic(renderer, scene)(包裹在Studio.wait中:ACES色调映射、反射用的工作室环境、柔和阴影)+ pbr(color, { metalness, roughness, clearcoat })。一个投射阴影的主光、一个从背后照射的冷色边缘光、一个带有CSS渐变的ShadowMaterial地面。摄像机应保持在掠射角以上(光滑表面会变白),缓慢移动,最终渲染时使用Studio.setup({ motionBlur: true })。
    • 霓虹风格(looks/neon-noir):emissive(color, intensity) + threeLayer(el, { post: bloom({ strength, threshold }) }),scene.fog。保持threshold ≥ 0.2,自发光强度 ≤ 2,否则所有发光都会变成白色。
  • 动画GLB片段:创建一个AnimationMixer,然后在update中调用mixer.setTime(t - start)。切勿使用mixer.update(delta)。
  • 跟随3D点的HTML标签:在update(t)中,调用camera.updateMatrixWorld()并在vector.applyMatrix4(obj.matrixWorld).project(camera)之前调用父对象的updateMatrixWorld()。Three.js仅在render()内部更新这些矩阵,因此如果没有调用render(),标签会跟随上一帧的位置。示例:productions/bike-logger/REEL-002-engines。
  • CAD网格(顶点+索引的JSON格式):使用toNonIndexed() + computeVertexNormals()可以获得清晰的平面刻面。使用threeLayer(..., { pixelRatio: 2 })进行渲染,以获得超采样边缘。
  • 物理效果:烘焙处理(在第一帧之前以固定步长1/120秒模拟并存入数组),然后通过t进行查找。
  • 会说话的角色:使用经典的<script>标签加载/engines/lipsync.js和台词的.visemes.js文件(由scripts/lipsync.sh生成),然后在update(t)中:LipSync.paramsAt(cues, t, "mouth", { offset }) → { open, wide, round }(值范围0~1),将其应用到形态目标(mesh.morphTargetInfluences)或嘴部网格的缩放。参见engines/README.md中的口型同步部分。

Blender(底板)

  • 场景脚本定义build(ctx);复制engines/blender/example_scene.py。ctx提供toon(rgb)、key(obj, "location", t, value)、size、fps、duration、frames和scene。
  • 渲染:engines/blender/render.sh scene.py composition/plates/<name>.mp4 --size 1080x1920 --duration 4 [--engine EEVEE|CYCLES|WORKBENCH]。草稿使用--size 540x960,最终渲染使用全尺寸。
  • 背景颜色:仅让摄像机看到(如示例中那样使用光路径“Is Camera Ray”混合),或者它可以照亮场景并压平卡通色带。
  • 色彩管理设置为标准,这样品牌十六进制颜色就会按原样输出。对于写实底板,在build中切换为ctx["scene"].view_settings.view_transform = "AgX",使用--engine CYCLES渲染,并使用区域光和摄像机景深。
  • 物理和模拟:在场景脚本中渲染之前进行烘焙。
  • 会说话的角色:在场景脚本中import lipsync as L(run.py会将engines/blender/和脚本自身所在的文件夹添加到路径中),cues = L.load("productions/…/audio/vo.visemes.json"),然后L.key_shape_keys(head, cues, ctx, offset=VO_START)在每一帧上为形态键open、wide、round设置关键帧(对于其他名称使用names={"open": "Jaw"})。其他情况:使用ctx["key"]在每帧上调用L.params_at(cues, t, offset=…)。
  • 在合成中:<video src="plates/<name>.mp4"> + Studio.video(el, { start })。底板没有Alpha通道;使用HTML层将文字和角色放在上面。

检查

将关键节拍渲染为静帧并查看它们。对于Three.js,将同一帧渲染两次并比较MD5。在生产日志中记录渲染时间。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能