从一个句子开始
Sea Train最初只是一句话:轨道上方有一米深的静水,一列四节车厢的火车从水面上滑过;车窗是唯一还留着暖意的东西,天空和水已经不再像两样东西。完整场景源码放在Makone里。
这句话拆开就是几组关系。长焦镜头把火车压成一条暗线。水面反射着同一片天空。电线在重力下自然下垂。时间让太阳和火车一起移动。数学上没有任何一处特别复杂,但每一部分都必须和其他部分保持一致。
先选一张照片,再搭世界
镜头先定下来,场景需要铺多大才变得清楚。相机是15.5°的窄视角,大约相当于全画幅85毫米镜头。它站在轨道侧面22米处,斜着看向远处。长焦把一列71.8米长的车组压成一条深色横带,刚好能和地平线抗衡。
代码里直接写死了视野角、相机位置和视线目标。相机位置在(-52, 0.62, 22),看向(115.5, 8.64, -6.93),远裁剪面拉到9000。广角在这里行不通。它会让火车近端像玩具,末端缩成一根针,轨道透视也会抢走静水的注意力。窄视角不那么“沉浸”,但那种扁平感正是构图需要的。
相机从头到尾不靠近火车。空荡荡的水面才是主体,火车只是压住它的那条暗线。
先画天空,再让水面把它拍下来
场景里没有物理大气。一张单像素渐变纹理存了十个颜色停靠点,着色器按视线仰角采样,再轻微做色调分层。这个镜头只看得到地平线上方大约十度,所以大部分颜色变化也都挤在那里。
天空色标从暖橙过渡到冷蓝:最底部是#ffdca6,往上经过#fbb994、#e199ac、#97a8cb、#4f8fb5,最后到#3c6b98。片元着色器先把视线方向转成仰角,再按14°以下和以上分段映射,最后用26条色带做62%的混合,让天空带上一点海报化的层次。
水面没有另做一套手工匹配的渐变,而是用Reflector从水面下方的虚拟相机重新渲染同一片天空。地平线两侧来自同一张图,所以不存在需要隐藏的颜色接缝。水面是一块5200乘5200的平面,反射纹理2048乘1152,clipBias设成0.0006,再套上自定义的水面着色器。
代码注释特别提醒:旋转的是物体本身,不是几何体。Reflector从物体的matrixWorld推导镜面法线,如果先旋转几何体,反射方向就会出错。
让每一部分都同意彼此
这个场景没有炫技的数学,难度在于协调。镜头、天空、水面、火车、电线、太阳,它们各自简单,但必须共享同一套尺度、同一片颜色、同一条时间线。任何一处不统一,安静感就会破掉。
最终效果是一幅接近照片的画面:水面几乎不动,火车像一条深色横线从画面一侧滑向另一侧,车窗是唯一温暖的光源。天空和水面因为来自同一张反射图,边界自然消失,看起来确实不再像两样东西。
热门跟贴