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。在生产日志中记录渲染时间。