百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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 (驱动器) 编辑器窗口中:

  1. 默认可能有一个名为 var 的变量, 如果有, 先点击它旁边的 X 图标将其删除.
  2. 点击 Add Input Variable (添加输入变量).
  3. 将变量类型 Type 从 Single Property (单一属性) 改为 Distance (距离).
  4. 给这个变量起个名字, 比如 distance (小写, 无空格, 方便后面在表达式中引用).

设置距离目标和空间

我们需要指定计算哪两个物体之间的距离.

  1. 在 Object 1 处, 使用吸管工具或下拉菜单选择 Camera (相机对象).
  2. 在 Object 2 处, 选择我们创建的 Plane (平面对象).
  3. 将 Object 1 和 Object 2 下方的 Space (空间) 都从 World Space (世界空间) 改为 Transform Space (变换空间).

原理: 使用 Transform Space 可以让距离计算忽略父级对象的缩放影响, 使得整个 Rig 在被缩放后依然能正常工作.

编写驱动器表达式 (基础)

现在, 我们需要在 Expression (表达式) 字段中告诉 Blender 如何使用这个距离变量.

  1. 删除 Expression 字段里的默认内容.
  2. 输入我们刚刚创建的变量名: distance.
  3. 按 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 窗口).

  1. 点击 Add Input Variable.
  2. 类型 Type 选择 Single Property.
  3. 命名为 scale.

配置缩放变量

  1. Prop (属性源) 选择 Plane 对象.
  2. 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) 这个空物体, 让它看起来更像一个控制器.

设置父子关系

将相机和焦平面控制器都设置为这个空物体的子级.

  1. 按住 Shift, 先选中 Camera 对象, 再选中 Plane 对象, 最后选中刚刚创建的 Empty 球体 (确保它是最后选中, 处于激活状态, 亮橙色).
  2. 按 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 对象.

  1. 在 Object Properties (对象属性) -> Visibility (可见性) -> Show In 下, 取消勾选 Renders (渲染).
  2. 在 Ray Visibility (光线可见性) 下, 取消勾选所有选项 (Camera, Diffuse, Glossy 等), 这样它就不会出现在反射或投射阴影等效果中.
  3. 在 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 已经完成了! 使用方法总结如下:

  1. 调整构图 (主体大小和位置): 选中 focal plane (线框平面), 按 G Z 前后移动它, 或者按 S 缩放它.
  2. 调整焦距/透视: 选中 focal plane camera (相机图标), 按 G Z 前后移动它. 主体在画面中的大小不变, 但透视关系会改变.
  3. 移动整体视角: 选中 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&#39;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&#39;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组件库,...