下载 App
开发日志 05 · 让摄像头走远一点
修改于昨天 16:047 浏览
开发日志 05 · 让摄像头走远一点
2026 聚光灯 Game Jam · 主题「涌现」


上一篇讲的是建模本身的坑。这一篇讲摄像头——它原来只有一个机位,现在有了四个,而且它自己会转。
顺带两件今天才想明白的小事:东西为什么不在画面里,以及声音是怎么变"漏出来"的。
一、那台摄像头不是人的头
监控画面里的摄像头会左右慢慢摇。
第一版我用的是 sint。写完之后怎么看怎么不对——中段快、两端慢。那是人的视线:你四处张望的时候,眼睛不会匀速扫。
监控云台是电机。它只有一个速度,到端点直接反向,中间没有减速段。
换成三角波:
jsconst u = t SPEED + phase % SPAN 4; const pan = u <= SPAN ? u : u <= SPAN 3 ? SPAN 2 - u : u - SPAN 4;
|dpan/dt| 恒等于 SPEED,一圈四段:过去 → 回来 → 回中线。
改完还发现一个更麻烦的事:扫视的相位是跟着游戏时间走的,而游戏时间是每帧固定加 0.016。帧率一低,云台就转得慢。机械件的转速不该由帧率决定——改成读真实时间。
现在它 1.8°/秒,一个来回 17 秒。慢到你会以为它没在动,然后突然发现画面已经换了个角度。
二、我以为我验过了,其实只验了一半
监控玩法是:屏幕里放一个摄像机的画面,玩家要在画面里找到目标物体。
每个场景有 8 个"落脚点",每局随机取 7 个摆进去。我写了脚本,把 8 个点投影到画面上,全部在框内,8/8。
结果玩起来还是有时找不到东西。
原因是那句话本身:我验的是"中心点在不在框内"。而摄像头在左右扫——贴在边缘的点,扫到另一端就出框了。我验的那个瞬间,它恰好在中间。
更根本的一条:监控相机是从天花板往下看桌面的。地面的东西,天生就在画框下沿以外。 这不是坐标写错了,是这个视角的几何事实。
所以改成开一局时按当前机位实时筛:投影一遍,出框的点这局就不参与(留 0.8 的余量,因为还要扫)。只剩不到 3 个可用点时才退回全量。
手调坐标永远会漏。让代码每一局自己判断。
三、让整间屋子变成线框
游戏里有个"终端闪断":平时不出现,某些时刻整块画面黑掉,只在同一台相机上画出所有物体的边,压成终端橙,然后闪几下就没了。
几个必须记住的点:
不能用 material.wireframe。 那会把每个三角形的边都画出来,四边形面多一条对角线。要 EdgesGeometrygeo, 30°——夹角小于 30° 的共面三角形会被合并,只留模型自己的边。
线框要做遮挡。 线是"只画线"的,深度缓冲里没东西挡它,所以是透视的。常规解法是先渲一遍只写深度、不写颜色的实体。我加了,画面一点没变。
查了很久:scene.background 是纯色时,three 每次 render 都会强制清屏(连深度一起清)。所以第二遍一开就把第一遍的深度冲掉了。这两遍渲染期间必须先把 background 置 null。
屏幕那块平面要从深度预渲里排除。 它贴在相机眼前,参与遮挡会把整个画面糊成一片黑。
四、怎么让一句话变成"漏出来的"
开场有一段是纯黑的,里面有一个声音在讲"最新模型"。
它不该是旁白去念。它是意外:管理员在跟别人说话,280–3200 Hz —— 像小喇叭/电话麦漏出来的,峰值压到 0.20 —— 比正式旁白弱四倍多
- 声像偏左 82% —— 它在旁边,不在你面前
- 混响加足 —— 隔着一间屋传过来
而后面正式旁白是反过来的:混响只给 0.10,居中,贴耳。
两个声音之间的落差本身就是叙事:黑屏里有人在说话(你不该听见),亮起来之后换成一个给你讲故事的声音(它在对你讲)。
顺带一句:配音用的是微软的神经网络音色(Christopher),英文,一句一句合成。这台机器到 Azure 的连接不太稳,中途开始一直断,后来改用同一个音色的另一条通道才跑完——音色一样,通道不同。
五、接下来
四个监控场景(工位 → 走廊 → 档案室 → 超算机房)已经接完了,剩下的是开场和尾声的演出。


开发日志会持续更新,游戏还在做,欢迎到时候来试玩。














