4.1 选机位:透视与正交的参数调校 本节摘要:透视机位模拟人眼近大远小,正交机位保持平行线平行——两者的选择是"取景观感"的第一决策。本节把透视机位四参数与正交机位六参数逐一调校,并讲透 near 与 far 背后的深度精度暗账,承接第 3 章的成品画面,让"怎么看"开始讲究。 两类取景,两种世界观 把同一个沙盘分别放进两类机位,差别一眼可辨:透视机位(PerspectiveCamera)里,远处的货箱缩成一排小点,画面有纵深有消失点,与人眼和实物摄影一致;正交机位(OrthographicCamera)里,远近货箱一样高,画面像工程制图,平行线笔直到天涯。这不是"效果滤镜"的差别,而是投影矩阵的数学差别:透视投影把视野折算成锥体(越远越宽),正交投影折算成长方体(处处等宽)。
本节摘要:透视机位模拟人眼近大远小,正交机位保持平行线平行——两者的选择是"取景观感"的第一决策。本节把透视机位四参数与正交机位六参数逐一调校,并讲透 near 与 far 背后的深度精度暗账,承接第 3 章的成品画面,让"怎么看"开始讲究。
把同一个沙盘分别放进两类机位,差别一眼可辨:透视机位(PerspectiveCamera)里,远处的货箱缩成一排小点,画面有纵深有消失点,与人眼和实物摄影一致;正交机位(OrthographicCamera)里,远近货箱一样高,画面像工程制图,平行线笔直到天涯。这不是"效果滤镜"的差别,而是投影矩阵的数学差别:透视投影把视野折算成锥体(越远越宽),正交投影折算成长方体(处处等宽)。
选择的判据只有一条:用户需要"空间感"还是"度量感"。产品展示、场景漫游、游戏画面要空间感——透视;CAD 图纸、等距风格游戏、数据图表、尺寸标注要度量感——正交。用错机位的页面不是不能看,而是"哪里怪怪的说不出来":给数据大屏上了透视机位,柱状图近端的柱子比远端粗一圈,数据就被视觉撒了谎。

背景:沙盘需要一台"评审用机位":能装下整个货盘、构图不畸变、画面无深度冲突。
操作:四参数逐一定标,注释写明每个数字的来路。
const aspect = stage.container.clientWidth / stage.container.clientHeight; const camera = new THREE.PerspectiveCamera( 50, // FOV:竖直视野角。45 到 60 是产品展示的舒适区, // 超过 90 接近鱼眼,画面边缘拉伸明显 aspect, // 宽高比:必须与画布同步(见 1.2 的 resize 成对更新) 0.5, // near:不要无脑取 0.1。沙盘最近物件离机位约 2 个单位, // near 抬高到 0.5,深度精度立刻宽裕一倍 100 // far:远裁剪面贴着需求给。沙盘最远物件 40 单位, // 给 100 留余量即可,给 10000 纯属浪费精度 ); camera.position.set(6, 5, 8); camera.lookAt(0, 1, 0); // 视线锚定货盘中心稍高处,构图重心稳定
结果:整个货盘入画,货箱无拉伸畸变,任意角度旋转都不出现表面斑驳。把 FOV 改成 100 再看:画面像广角监控,边缘货箱被拉得变形——FOV 每一次大改都要重新站位,它和机位距离是构图的一对搭档。
解读:near 与 far 的暗账值得单独说。深度缓冲是有限的精度位数,平铺在 near 到 far 之间,且分配极不均匀——越靠近 near 精度越密。near 取 0.001 而 far 取 1000 时,百万分之一的精度预算给了"机位眼前那 1 毫米",场景深处的表面分不出先后,深度冲突条纹(两个面斑驳互抢)就出现了。经验法则:near 不小于"最近物件距离的十分之一",far 不大于"最远物件距离的两倍",比值越接近 1,深度越稳。
变式:正交机位版仪表盘——客户要求把货箱数量统计做成 2D 风格的俯视图,切正交机位:按容器宽高比换算左右边界(viewSize 乘 aspect 分摊到左右,viewSize 对半给上下),窗口缩放时同步重设;再开一版等距风格:正交机位斜 45 度俯视,画面立刻有"建筑效果图"的气质——同一场景、一台机位的距离,观感截然两分。
第 2 章埋的伏笔在此兑现:阴影相机的本质就是一台正交相机挂在方向光上取景——所以 2.3 的阴影边界标定与正交机位的六参数完全同构,理解了这一节,阴影相机不再是黑盒。同样,第 7 章的立方体环境贴图也会从六个机位各拍一张——"机位"在 Three.js 里是一个通用概念:哪里需要"从某点看出去的视图",哪里就有相机。
事故一,"窗口一拉小,画面就压扁"。宽高比只在初始化时取了一次,容器变化后没有成对更新;回看 1.2 的 resize 成对纪律,aspect 与投影矩阵必须一起动。事故二,"模型离机位很近却突然消失"。near 裁剪面把贴脸的部分裁掉了——物件一旦进入 near 平面以内就不参与绘制,表现是"凑近看细节时物件像被削了一刀";把 near 收小要连着深度精度一起权衡,或干脆把机位退半步。事故三,"正交机位下窗口缩放,画面上下被裁"。正交机位的上下边界是固定数值,不随宽高比重算;正确做法是锁定一个"视野高度",宽度由高度乘当前宽高比反推,缩放时重设左右——与透视机的 aspect 更新互为镜像。
参数之外,机位还有一套"语言"层面的实践。其一,视线锚点决定画面重心:lookAt 的目标点选在主体中心稍高处,画面下稳上空,比死对原点更有构图感;展示页常用的公式是目标点 y 取主体高度的三分之一。其二,俯仰角传递情绪:低机位仰视让物件显得庄严(产品广告常用),高机位俯视给全局感(大屏与地图常用),同场景切俯仰比切机位距离的情绪收益更大。其三,留白与安全区:Web 页面的 3D 视图常被 UI 角标占用边缘,构图时把主体收进中央七成区域,避免信息层压住关键细节。这三条没有代码,却直接决定评审会上第一眼的好感度——机位工位的产出从来是"参数加审美"的合订本。
大屏展示常见"全景与特写并存"的布局:主视图透视机位可旋转,旁边一块小窗用正交机位俯视全局。实现思路是两个相机共用一个场景,各自渲染到各自的画布(或用视口分区域渲染)。注意两台机位各自维护 aspect 与投影矩阵,resize 时要成对照顾;阴影、泛光这类全场景开销不因机位增多而翻倍——机位是便宜的,把一台用好再加第二台。
取景已定,下一节上云台:轨道控制的球面模型与手感配置,以及让机位自己讲故事的运镜脚本。