Blender 相机控制: 解耦焦距与构图
zhezhongyun 2025-05-28 21:40 79 浏览
在使用 Blender 进行场景布局和动画制作时, 相机的控制往往令人头疼. 调整焦距 (Focal Length) 会改变透视效果, 但同时也会影响画面构图; 重新调整构图又可能需要移动相机, 再次影响焦距选择. 这个过程常常需要反复调整, 效率不高.
本教程将介绍一种 Camera Rig (相机绑定) 的制作方法, 它的核心原理是将相机的焦平面 (Focal Plane) 控制与相机本身的位置 (或者说传感器平面 Sensor Plane) 分离开.
- 你可以独立调整焦平面控制器来确定画面中主体的大小和位置 (构图).
- 你可以独立移动相机本身来改变焦距和透视效果, 而不影响之前定好的主体构图.
- 你还可以移动整个 Rig 的主控制器来像普通相机一样移动整体视角.
这种方法可以让你更直观、高效地控制相机, 先确定构图, 再尝试不同的焦距和透视效果.
让我们开始吧.
创建相机
首先, 我们需要一个相机.
按 Shift+A, 选择 Camera (相机), 在场景中创建一个相机.
为了方便后续操作, 重置一下它的旋转: 选中相机, 按 Alt+R.
创建焦平面控制器
接下来, 我们需要一个物体来代表并控制焦平面. 我们用一个简单的平面来实现.
按 Shift+A, 选择 Mesh (网格) -> Plane (平面).
调整控制器尺寸
为了让这个平面在视觉上更容易匹配相机视图, 我们可以将它的尺寸调整为常见的 16:9 宽高比.
选中刚刚创建的平面. 按 N 打开侧边栏, 切换到 Item (条目) 选项卡.
在 Dimensions (尺寸) 下:
- 设置 X 为 1m.
- 设置 Y 为 0.5625m (也就是 9 除以 16 的结果).
Blender 的相机 Sensor Fit (传感器适配) 默认为 Auto (自动) 或 Horizontal (水平), Sensor Size (传感器尺寸) 默认为 36mm. 当焦距也设置为 36mm 时, 距离相机原点 1 个单位远、宽度为 1 个单位的物体, 其宽度刚好能撑满相机画面. Y 尺寸设为 9/16 是为了匹配 16:9 的画面比例 (36mm * 9 / 16 ≈ 20.25mm, 这与垂直适配时的传感器高度有关, 但这里我们用比例更直观).
定位控制器
将平面控制器移动到相机前方 1 个单位的位置 (沿其局部 Z 轴负方向).
选中平面, 按 G -> Z -> 输入 -1 -> 按 Enter 确认.
对齐相机参数
现在, 设置相机参数, 使其在特定焦距下刚好能"看到"整个平面控制器.
选中相机. 前往右侧的 Object Data Properties (对象数据属性, 绿色相机图标).
- 在 Lens (镜头) 面板下, 将 Focal Length (焦距) 设置为 36mm.
- (可选) 确认 Camera (相机) 面板下的 Sensor Fit (传感器适配) 为 Auto (自动) 或 Horizontal (水平), Size (尺寸) 为 36mm. 这是 Blender 的默认值.
此时, 如果你进入相机视图 (按数字键盘 0), 这个平面应该刚好充满视图宽度 (如果你之前设置了宽高比). 这个对齐是后续驱动器设置的基础.
添加驱动器:关联距离与焦距
这是核心步骤. 我们要用驱动器 (Driver) 让相机焦距能够根据它与焦平面控制器的距离自动调整.
选中相机. 在 Object Data Properties -> Lens -> Focal Length 字段上右键单击.
选择 Add Driver (添加驱动器).
为了方便编辑, 再次右键单击 Focal Length 字段 (现在它变成了紫色), 选择 Open Drivers Editor (打开驱动器编辑器). 你也可以在顶部菜单 Window -> Animation -> Drivers 打开.
配置距离变量
在打开的 Drivers (驱动器) 编辑器窗口中:
- 默认可能有一个名为 var 的变量, 如果有, 先点击它旁边的 X 图标将其删除.
- 点击 Add Input Variable (添加输入变量).
- 将变量类型 Type 从 Single Property (单一属性) 改为 Distance (距离).
- 给这个变量起个名字, 比如 distance (小写, 无空格, 方便后面在表达式中引用).
设置距离目标和空间
我们需要指定计算哪两个物体之间的距离.
- 在 Object 1 处, 使用吸管工具或下拉菜单选择 Camera (相机对象).
- 在 Object 2 处, 选择我们创建的 Plane (平面对象).
- 将 Object 1 和 Object 2 下方的 Space (空间) 都从 World Space (世界空间) 改为 Transform Space (变换空间).
原理: 使用 Transform Space 可以让距离计算忽略父级对象的缩放影响, 使得整个 Rig 在被缩放后依然能正常工作.
编写驱动器表达式 (基础)
现在, 我们需要在 Expression (表达式) 字段中告诉 Blender 如何使用这个距离变量.
- 删除 Expression 字段里的默认内容.
- 输入我们刚刚创建的变量名: distance.
- 按 Enter 或点击 Update Dependencies (更新依赖项).
你会看到 Focal Length 的值变成了 1mm (因为平面距离相机是 1 个单位). 但我们还需要考虑 Blender 相机的默认传感器尺寸 (36mm). 所以, 需要将距离乘以 36.
修改 Expression 为: distance * 36
现在, 如果你移动 Plane (G, Z), 你会看到相机的 Focal Length 会自动变化, 并且相机视锥的末端始终与 Plane 保持重合.
添加驱动器:关联控制器缩放
我们还需要让焦平面控制器的大小也能影响相机. 具体来说, 控制器的缩放应该同时驱动相机本身的缩放.
选中 Plane (平面控制器).
在 Object Properties (对象属性, 橙色方块图标) -> Transform (变换) -> Scale (缩放) 下:
右键单击 Scale X 的值, 选择 Copy As New Driver (复制为新驱动器).
粘贴驱动器到相机缩放
选中 Camera (相机对象).
在 Object Properties -> Transform -> Scale 下:
- 右键单击 Scale X, 选择 Paste Driver (粘贴驱动器).
- 右键单击 Scale Y, 选择 Paste Driver.
- 右键单击 Scale Z, 选择 Paste Driver.
现在, 如果你缩放 (S) Plane 控制器, 相机对象也会跟着一起缩放.
应用平面缩放 (重要)
为了让后续的缩放计算基于正确的初始值 (Scale=1), 我们需要应用平面的缩放.
选中 Plane 控制器. 按 Ctrl+A, 选择 Apply -> Scale (应用 -> 缩放).
添加驱动器:关联控制器缩放与焦距
现在我们已经将距离和基础焦距关联了, 但当焦平面控制器缩放时, 焦距还需要反向调整才能保持视锥对齐.
回到相机的 Focal Length 驱动器编辑器 (Drivers 窗口).
- 点击 Add Input Variable.
- 类型 Type 选择 Single Property.
- 命名为 scale.
配置缩放变量
- Prop (属性源) 选择 Plane 对象.
- Path (路径) 需要填入 Plane 的 X 轴缩放属性路径. 我们可以通过以下方式获取:选中 Plane 对象.在 Object Properties -> Transform -> Scale 下, 右键单击 Scale X 的值.选择 Copy Data Path (复制数据路径).回到驱动器编辑器的 Path 字段, 按 Ctrl+V 粘贴. 路径应该是 scale[0] (方括号里的 0 代表 X 轴).
更新焦距驱动器表达式 (最终)
我们需要将原来的表达式 distance * 36 除以 Plane 的缩放值.
将 Expression 修改为: distance * 36 / scale
当 Plane 控制器变大 (scale > 1) 时, 我们需要减小焦距才能让视锥框住它; 当 Plane 变小 (scale < 1) 时, 需要增大焦距. 因此用除法实现这种反向关系.
现在, 无论你移动 (G Z) 还是缩放 (S) Plane 控制器, 相机的焦距都会自动调整, 并且视锥始终精确地框住这个控制器.
创建主控制器
为了方便移动整个绑定好的相机系统, 我们再添加一个主控制器.
按 Shift+A, 选择 Empty (空物体) -> Sphere (球体).
可以适当缩小 (S) 这个空物体, 让它看起来更像一个控制器.
设置父子关系
将相机和焦平面控制器都设置为这个空物体的子级.
- 按住 Shift, 先选中 Camera 对象, 再选中 Plane 对象, 最后选中刚刚创建的 Empty 球体 (确保它是最后选中, 处于激活状态, 亮橙色).
- 按 Ctrl+P, 选择 Set Parent To -> Object (Keep Transform) (设置父级到 -> 对象 (保持变换)).
整理命名和大纲视图
给各个部件起清晰的名字是个好习惯.
- 选中 Empty 球体, 按 F2, 重命名为 focal plane rig.
- 选中 Camera 对象, 按 F2, 重命名为 focal plane camera.
- 选中 Plane 对象, 按 F2, 重命名为 focal plane.
现在大纲视图 (Outliner) 里层级关系就很清晰了.
调整初始旋转
Blender 相机默认是朝下的, 这不太符合直觉.
选中主控制器 focal plane rig.
按 R -> X -> 输入 90 -> 按 Enter. 将整个 Rig 旋转到朝前.
优化控制器可见性
焦平面控制器 (focal plane) 是用来控制的, 我们不希望它被渲染出来, 或者遮挡视线.
选中 focal plane 对象.
- 在 Object Properties (对象属性) -> Visibility (可见性) -> Show In 下, 取消勾选 Renders (渲染).
- 在 Ray Visibility (光线可见性) 下, 取消勾选所有选项 (Camera, Diffuse, Glossy 等), 这样它就不会出现在反射或投射阴影等效果中.
- 在 Object Properties -> Viewport Display (视图显示) 下, 将 Display As (显示为) 从 Textured (纹理) 改为 Wire (线框).
这样它在视图中就变成了一个线框, 不会遮挡模型, 但仍然可以被选中.
使控制器更容易选中 (可选)
线框有时不太容易点选. 我们可以让线框变得更"粗"一点, 但又不影响其功能.
选中 focal plane 对象. 按 Tab 进入 Edit Mode (编辑模式).
按 A 全选所有顶点. 按 S 将其放大一些 (比如放大 1.5 到 2 倍).
按 Tab 退出编辑模式.
在编辑模式下缩放只改变顶点位置, 不改变物体本身的 Scale (缩放) 属性, 因此不会影响我们之前设置的驱动器.
锁定不需要的变换
为了防止误操作破坏 Rig 的逻辑, 我们可以锁定某些不需要手动调整的变换属性.
选中 focal plane 控制器.
在 Object Properties -> Transform 中, 点击每个属性值旁边的锁形图标:
- 锁定 Location (位置) 的 X 和 Y 轴.
- 锁定 Rotation (旋转) 的 X, Y, Z 轴.
- 解锁 Scale (缩放) 的 X, Y, Z 轴 (允许缩放).
- 解锁 Location (位置) 的 Z 轴 (允许前后移动).
选中 focal plane camera 对象.
- 锁定所有 Location (X, Y, Z).
- 锁定所有 Rotation (X, Y, Z).
- 锁定所有 Scale (X, Y, Z), 因为它的缩放已经被驱动器控制了.
- 只解锁 Location Z (允许相机前后移动以改变透视).
主控制器 focal plane rig 则保持所有变换解锁, 因为我们需要用它来自由移动和旋转整个相机系统.
启用相机父级锁定
这是一个非常有用的功能, 特别是当你喜欢使用 Camera to View (锁定相机到视图) 功能来调整视角时.
选中 focal plane camera 对象.
在 Object Properties -> Relations (关系) 下, 勾选 Camera Parent Lock (相机父级锁定).
启用此选项后, 当你激活 Camera to View (快捷键 N 打开侧边栏 -> View (视图) -> Lock Camera to View) 并在相机视图中导航时, Blender 不会移动相机本身, 而是会移动相机的父级对象 (也就是我们的 focal plane rig 主控制器). 这就完美契合了我们的 Rig 设计.
如何使用
现在, 这个相机 Rig 已经完成了! 使用方法总结如下:
- 调整构图 (主体大小和位置): 选中 focal plane (线框平面), 按 G Z 前后移动它, 或者按 S 缩放它.
- 调整焦距/透视: 选中 focal plane camera (相机图标), 按 G Z 前后移动它. 主体在画面中的大小不变, 但透视关系会改变.
- 移动整体视角: 选中 focal plane rig (空物体球体), 使用 G (移动) 或 R (旋转) 来像操作普通相机一样调整整体视角. 配合 Lock Camera to View 使用效果更佳.
希望这个教程能帮助你更高效地掌控 Blender 中的相机!
相关推荐
- Chinese vice premier calls for multilateralism at Davos
-
DAVOS,Switzerland,Jan.21(Xinhua)--ChineseVicePremierDingXuexiangdeliveredaspeechatthe...
- 用C++ Qt手把手打造炫酷汽车仪表盘
-
一、项目背景与核心价值在车载HMI(人机交互界面)开发领域,虚拟仪表盘是智能座舱的核心组件。本项目基于C++Qt框架实现一个具备专业级效果的时速表模块,涵盖以下技术要点:Qt图形绘制核心机制(QPa...
- 系列专栏(八):JS的第七种基本类型Symbols
-
ES6作为新一代JavaScript标准,已正式与广大前端开发者见面。为了让大家对ES6的诸多新特性有更深入的了解,MozillaWeb开发者博客推出了《ES6InDepth》系列文章。CSDN...
- MFC界面开发工具BCG v31.1 - 增强功能区、工具箱功能
-
点击“了解更多”获取工具亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBarProfessionalforMFC和BCGSuiteforMFCv31.2正式发布!新版本支...
- 雅居乐上调出售吉隆坡项目保留金,预计亏损扩大至6.64亿元
-
1月2日,雅居乐集团(03383.HK)发布有关出售一家附属公司股权披露交易的补充公告。此前雅居乐集团曾公告,2023年11月8日(交易时段后),集团子公司AgileRealEstateDeve...
- Full text: Address by Vice Premier Ding Xuexiang's at World Economic Forum Annual Meeting 2025
-
DAVOS,Switzerland,Jan.21(Xinhua)--ChineseVicePremierDingXuexiangonTuesdaydeliveredasp...
- 手机性能好不好 GPU玄学曲线告诉你
-
前言各位在看测试者对手机进行评测时或许会见过“安卓玄学曲线”,所谓中的安卓玄学曲线真名为“ProfileGPURendering”。大多数情况下,在系统“开发者选项中被称为“GPU显示配置文件”或...
- 小迈科技 X Hologres:高可用的百亿级广告实时数仓建设
-
通过本文,我们将会介绍小迈科技如何通过Hologres搭建高可用的实时数仓。一、业务介绍小迈科技成立于2015年1月,是一家致力以数字化领先为优势,实现业务高质量自增长的移动互联网科技公司。始...
- vue3新特征和所有的属性,方法汇总及其对应源码分析
-
vue3新特征汇总与源码分析(备注:vue3使用typescript编写)何为应用?constapp=Vue.createApp({})app就是一个应用。应用的配置和应用的API就是app应用...
- China's stability redefines global trade in a volatile era
-
ContainersareunloadedatQingdaoPort,eastChina'sShandongProvince,December10,2024.[Photo/X...
- QML 实现图片帧渐隐渐显轮播
-
前言所谓图片帧渐隐渐显轮播就是,一组图片列表,当前图片逐渐改变透明度隐藏,同时下一张图片逐渐改变透明度显示,依次循环,达到渐隐渐显的效果,该效果常用于图片展示,相比左右自动切换的轮播方式来说,这种方式...
- 前端惊魂夜:我竟在CSS里写出了JavaScript?
-
凌晨两点,写字楼里只剩下我工位上的一盏孤灯。咖啡杯见底,屏幕的光映在疲惫的眼镜片上。为了实现一个极其复杂的动态渐变效果,我翻遍了MDN文档,试遍了所有已知的CSS技巧,却始终差那么一口气。“要是CSS...
- 10 个派上用场的 Flutter 小部件
-
尝试学习一门新语言可能会令人恐惧和厌烦。很多时候,我们希望我们知道早先存在的某些功能。在今天的文章中,我将告诉你我希望早点知道的最方便的颤振小部件。SpacerSpacer创建一个可调整的空白空...
- 让我的 Flutter 代码整洁 10 倍的 5 种
-
如果你曾在Flutter中使用过SingleTickerProviderStateMixin来制作动画,猜猜怎么着?你已经使用过Mixin了——恭喜你,你已经处于一段你甚至不知道的关...
- daisyUI - 主题漂亮、代码纯净!免费开源的 Tailwind CSS 组件库
-
漂亮有特色的CSS组件库,组件代码非常简洁,也支持深度定制主题、定制组件,可以搭配Vue/React等框架使用。关于daisyUIdaisyUI是一款极为流行的CSSUI组件库,...
- 一周热门
- 最近发表
-
- Chinese vice premier calls for multilateralism at Davos
- 用C++ Qt手把手打造炫酷汽车仪表盘
- 系列专栏(八):JS的第七种基本类型Symbols
- MFC界面开发工具BCG v31.1 - 增强功能区、工具箱功能
- 雅居乐上调出售吉隆坡项目保留金,预计亏损扩大至6.64亿元
- Full text: Address by Vice Premier Ding Xuexiang's at World Economic Forum Annual Meeting 2025
- 手机性能好不好 GPU玄学曲线告诉你
- 小迈科技 X Hologres:高可用的百亿级广告实时数仓建设
- vue3新特征和所有的属性,方法汇总及其对应源码分析
- China's stability redefines global trade in a volatile era
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- opacity 属性 (32)
- transition 属性 (33)