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

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

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

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

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...