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

Blender 相机控制: 解耦焦距与构图

zhezhongyun 2025-05-28 21:40 11 浏览

在使用 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 中的相机!

相关推荐

饿了么面试官:实现一下 Element-UI 官网的主题切换动画!

最近看到ElementPlus官网上的切换主题方式非常有趣,这是一个过渡的动画效果所以在网上查了一番,找到基本的实现方法实现基本效果首先我们起一个html文件,写一个按钮,以及简单的背景颜色切...

强大而好用的选择器:focus-within

伪类和伪元素在开发网页样式中,选择器必不可少,而且选择器也是在开发css中非常重要的内容,包括常用的类选择器,id选择,同时还有伪类,伪类选择器最大的特点就是冒号开头。平时也经常会有小伙伴问到,在使用...

令程序员惊叹的一些CSS3效果库

还在寻找那些CSS3的效果库吗?如果你的答案是肯定的,并且目前没有找到,那么你一定不能错过小编为大家收集的这些CSS3效果库,这是一个令你兴奋的集合!最新的CSS3都配备了新的特性,来设计创建动画和互...

伪元素黑魔法:一个替代onerror解决图片加载失败的方案

问题的引出是这样的,在一个项目中有大量的页面主体是table做数据展示,所以就封装了一个table的组件,提供动态渲染的方案。有个问题是数据类型中有图片,对于图片的加载失败我们需要做容错。一般我们的思...

前端 - 如何通过CSS修改图片透明度

如果在图片上显示文字,经常会遇到这个情况,就是当文字和背景颜色差不多时,文字会看不清楚,我们一般通过给文字加textshadow或者修改图片的透明度来让文字显示更加突出。我们今天说一下透明度的问题,...

CSS元素居中方法完全指南

这里是工作狂的聚集地职场学术新媒体设计极客专门治愈处女座强迫症。本文为CSS入门翻译redman9原载CSS-Trick人们经常抱怨在CSS中居中元素的问题,其实这个问题并不复杂,只是因为方法众...

CSS图像 hover 动画效果

点击页底“阅读原文”下载原码CSSHover在网页设计中是极为常用的一个CSS效果,只要你有创造力,都可以让Hover变得更多姿多彩,今天我们主要分享40多款使用CSSHOVER完成...

前端能限制用户截图吗?

摘要:在某些业务场景下,保护屏幕信息的私密性,防止用户随意截图分享,成为了前端开发者的一个棘手需求。但浏览器和操作系统的设计,真的允许网页开发者完全掌控用户的截图行为吗?本文将深入探讨前端限制截图的...

每天一个CSS小技巧 - 不规则投影

当我们想给一个矩形或者其他能用border-radius生成的形状加投影时,box-shadow的表现都很棒的。但是,当元素添加可一些伪元素或半透明的装饰之后,border-radius会无视这些。这...

Web开发中10个有用的免费CSS代码

在本文中主要展示了在Web开发中一些免费但是非常有用的代码,开发人员可以下载它们来简化工作流程。在这个集合中的所有代码都是经过精挑细选的,对于开发人员来说非常有用。在开发一个网站时,这些代码将节省大量...

什么是伪类和伪元素?两者有什么区别?单一冒号和双冒号有何不同

https://juejin.im/post/5df1e312f265da33d039d06d?utm_source=bigezhang.com#comment伪类伪类存在的意义是为了通过选择器找到那...

CSS2与CSS3中常用的伪类汇总大全

CSS2与CSS3中有非常多的伪类,可以用于实现各种强大的、酷炫的功能。有用于选择标签状态的,如:a:linka:hoverinput:checkedinput:focus等;也有用于根据结构选...

实用!这8个CSS工具可以提升编程速度

作为网页设计师,为了在预期的时间内能完成项目,前期肯定是要进行大量练习的。但是如果你花了大量的时间在编写CSS代码上,那无疑是浪费时间。工欲善其事必先利其器,聪明的设计师善于利用工具提升他们的编码效率...

《丝路传说怀旧版》宠物融合丹:属性加成与技能继承要点

在《丝路传说怀旧版》中,宠物融合丹是优化宠物属性与技能的核心道具,其使用需结合技能继承规则、品质提升机制及资源规划策略。以下是关键要点分析一、属性加成机制品质提升与属性增长品质阶梯:宠物分为白、绿、蓝...

Python 3.14 t-string 要来了,它与 f-string 有何不同?

Python最近出了个大新闻:PEP-750t-string语法被正式采纳了!这意味着Python将在今年10月发布的3.14版本中引入一种新的字符串前缀t,称为模板字符串(Tem...