mcpField
B
blender-cameras

blender-cameras

github.com/roble3创意与媒体1281.2k 次安装2 周前更新
代码仓库

关于 blender-cameras

面向 Blender 场景创作者的摄影机设置技能,按焦距、光圈和构图提供实用指南与配方。内容包括主体取景、肖像与产品镜头,以及环绕和推镜动画。

主要功能

  1. 01焦距与景别选择指南
  2. 02按主体边界框设置摄影机
  3. 03肖像和产品镜头配方
  4. 04构图辅助线与构图规则
  5. 05环绕及推镜动画

适用场景

  1. 01为角色肖像设置浅景深镜头
  2. 02为产品渲染安排特写构图
  3. 03为环境场景设置广角建立镜头
  4. 04制作主体环绕或推近动画

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/roble3/cc-blender-skill --skill blender-cameras

安装后在 Claude Code 中输入/blender-cameras确认已加载。

附带文件evals/evals.jsonreferences/overview.md

详细介绍

Blender 相机

像真正的电影摄影师一样设置相机:用焦距营造感觉,用光圈控制对焦,用构图讲述故事。

焦距速查表

焦距感觉用途
14–24mm超广角,有畸变建筑、令人压抑的室内场景、夸张透视
28–35mm广角、“纪实感”建立镜头、环境场景
50mm中性(≈人眼视角)默认叙事
85mm短焦望远人像、人物特写(更显美观)
100–135mm望远主打产品镜头、孤立主体
200mm+长焦野生动物、监控感、强烈压缩感

快速规则:85mm 营造亲密感,24mm 展现宏大场面,50mm 呈现中性效果。

光圈 / f 值

f 值景深用途
f/1.2–2.0极浅主打人像、梦幻效果
f/2.8浅标准人像
f/4适中画面中有两个主体
f/5.6–8中深群像、环境场景
f/11+很深风景、“所有内容都清晰”

配方

配方 0 — 基于边界框的主打镜头(适用于编排器链,优先使用)

在有明确主体时使用。计算主体的边界框,将相机放置在能使主体占画面垂直方向约 80% 的距离处,并通过 Track-To 瞄准主体。

import bpy, math
from mathutils import Vector

# Choose subject — all meshes named GEO-* by default, or pass a specific list
subject_meshes = [o for o in bpy.data.objects if o.type == 'MESH' and o.name.startswith('GEO-')]
if not subject_meshes:
    raise RuntimeError("No subject meshes found (looking for GEO- prefix)")

# World-space bbox
deps = bpy.context.evaluated_depsgraph_get()
all_verts = []
for o in subject_meshes:
    eo = o.evaluated_get(deps); em = eo.to_mesh()
    for v in em.vertices:
        all_verts.append(o.matrix_world @ v.co)
    eo.to_mesh_clear()
xs = [v.x for v in all_verts]; ys = [v.y for v in all_verts]; zs = [v.z for v in all_verts]
center = Vector(((min(xs)+max(xs))/2, (min(ys)+max(ys))/2, (min(zs)+max(zs))/2))
height = max(zs) - min(zs)
width = max(xs) - min(xs)
biggest = max(height, width)

# Frame fit: at distance D, vertical frame = D × (sensor_h / focal). Solve for D.
focal_mm = 60        # 60mm gives a flattering not-too-wide hero shot
sensor_h_mm = 24     # full-frame
frame_per_meter = sensor_h_mm / focal_mm   # 0.4 m vertical frame per metre of distance
target_fill = 0.80
camera_distance = biggest / (frame_per_meter * target_fill)

# Camera positioned in front (negative Y) with slight X offset for a 3/4 angle
cam_pos = Vector((center.x + camera_distance * 0.3, center.y - camera_distance, center.z))

# Empty for tracking
empty_name = 'Empty-camera_target'
empty = bpy.data.objects.get(empty_name) or bpy.data.objects.new(empty_name, None)
if empty.name not in [o.name for o in bpy.context.collection.objects]:
    bpy.context.collection.objects.link(empty)
empty.location = center

# Camera
cam_data = bpy.data.cameras.new('CAM-hero')
cam_data.lens = focal_mm
cam_data.dof.use_dof = True
cam_data.dof.aperture_fstop = 4.0
cam_data.dof.focus_object = subject_meshes[0]   # focus on first/main subject

cam = bpy.data.objects.new('CAM-hero', cam_data)
bpy.context.collection.objects.link(cam)
cam.location = cam_pos

track = cam.constraints.new('TRACK_TO')
track.target = empty
track.track_axis = 'TRACK_NEGATIVE_Z'
track.up_axis = 'UP_Y'

bpy.context.scene.camera = cam
print(f"camera:bbox_aware center={tuple(round(v,2) for v in center)} dist={camera_distance:.2f}m focal={focal_mm}mm")

对于细长的垂直主体(剑、旗帜、蜡烛):最大尺寸是高度;取景计算会让高度占画面垂直方向的 80%,这正是你想要的效果。

对于宽阔的水平主体(汽车、桌子):最大尺寸是宽度;它也会让宽度占画面垂直方向的 80%,导致放大过度——这类主体应改用 frame_per_meter_h = (sensor_h_mm * aspect_ratio) / focal_mm,或调低 target_fill。

配方 1 — 主打人像相机(85mm + 浅景深)
import bpy, math

subject = bpy.data.objects.get('GEO-subject')   # change to your subject

# Camera
cam_data = bpy.data.cameras.new('CAM-hero')
cam = bpy.data.objects.new('CAM-hero', cam_data)
bpy.context.collection.objects.link(cam)
bpy.context.scene.camera = cam

cam.location = (3, -4, 1.6)
cam_data.lens = 85
cam_data.sensor_width = 36

# Depth of field
cam_data.dof.use_dof = True
cam_data.dof.aperture_fstop = 2.8
if subject:
    cam_data.dof.focus_object = subject

# Track-to constraint (auto-aim at subject)
if subject:
    track = cam.constraints.new('TRACK_TO')
    track.target = subject
    track.track_axis = 'TRACK_NEGATIVE_Z'
    track.up_axis = 'UP_Y'

print('camera:CAM-hero set')
配方 2 — 广角环境建立镜头(24mm)
import bpy, math

cam_data = bpy.data.cameras.new('CAM-establish')
cam = bpy.data.objects.new('CAM-establish', cam_data)
bpy.context.collection.objects.link(cam)
bpy.context.scene.camera = cam

cam.location = (8, -10, 2.5)
cam.rotation_euler = (math.radians(80), 0, math.radians(35))

cam_data.lens = 24
cam_data.sensor_width = 36
cam_data.dof.use_dof = False

print('camera:CAM-establish (24mm wide)')
配方 3 — 产品主打镜头(100mm + 微距景深)
import bpy, math

subject = bpy.data.objects.get('GEO-product')

cam_data = bpy.data.cameras.new('CAM-product')
cam = bpy.data.objects.new('CAM-product', cam_data)
bpy.context.collection.objects.link(cam)
bpy.context.scene.camera = cam

cam.location = (0.4, -1.5, 0.2)   # close-in
cam_data.lens = 100
cam_data.sensor_width = 36
cam_data.dof.use_dof = True
cam_data.dof.aperture_fstop = 2.0
if subject:
    cam_data.dof.focus_object = subject

if subject:
    track = cam.constraints.new('TRACK_TO')
    track.target = subject
    track.track_axis = 'TRACK_NEGATIVE_Z'
    track.up_axis = 'UP_Y'

print('camera:CAM-product (100mm hero)')
配方 4 — 构图辅助线(三分法叠加线)
import bpy

cam_data = bpy.data.cameras['CAM-hero']
cam_data.show_composition_thirds = True
cam_data.show_composition_golden = False
cam_data.show_composition_center = False
print('composition:thirds_on')

这些叠加线仅显示在视口中,不会影响渲染。

配方 5 — 环绕相机动画(10 秒 360° 转台)
import bpy, math

target = bpy.data.objects.get('GEO-subject')

# Empty as pivot
pivot = bpy.data.objects.new('Empty-orbit_pivot', None)
bpy.context.collection.objects.link(pivot)
if target:
    pivot.location = target.location

# Camera child of pivot
cam_data = bpy.data.cameras.new('CAM-orbit')
cam = bpy.data.objects.new('CAM-orbit', cam_data)
bpy.context.collection.objects.link(cam)
cam.parent = pivot
cam.location = (0, -5, 0.5)
cam.rotation_euler = (math.radians(85), 0, 0)
cam_data.lens = 50

bpy.context.scene.camera = cam

# Animate pivot's Z rotation: 0 → 360° over frames 1..240 (10s @ 24fps)
pivot.rotation_euler = (0, 0, 0)
pivot.keyframe_insert('rotation_euler', frame=1)
pivot.rotation_euler = (0, 0, math.radians(360))
pivot.keyframe_insert('rotation_euler', frame=240)

# Set linear interpolation for constant orbit speed
if pivot.animation_data and pivot.animation_data.action:
    for fc in pivot.animation_data.action.fcurves:
        for kp in fc.keyframe_points:
            kp.interpolation = 'LINEAR'

print('camera:CAM-orbit (10s turntable)')
配方 6 — 推镜头 / 移动摄影车(相机向前移动,不变焦)
import bpy

cam = bpy.data.objects['CAM-hero']

# Start position
cam.location = (3, -8, 1.6)
cam.keyframe_insert('location', frame=1)

# End position (closer to subject)
cam.location = (3, -4, 1.6)
cam.keyframe_insert('location', frame=120)
print('camera:dolly_5s')

推镜头(相机实际向前移动)在视觉上不同于变焦(改变焦距)。用推镜头营造电影感,用变焦营造监控或新闻报道的感觉。

构图规则 — 通过定位来落实

  1. 三分法:将主体放在 4 个交点之一,而不是画面中央。
  2. 头部留白:在头部上方留出约 10% 的空白。
  3. 视线空间:如果主体面向左侧,就在左侧留出空间,让主体“看向”那里。
  4. 前景 / 中景 / 背景:三个景深层次会让画面更有电影感。

传感器尺寸

传感器宽度(mm)说明
全画幅 DSLR / 35mm 电影摄影机36默认
APS-C22.51.5–1.6×裁切系数
Super 3524.89多数电影摄影机使用
Micro Four Thirds17.3无反相机
iPhone 15 Pro9.8智能手机参考值

使用 cam_data.sensor_width = 36 设置。

常见问题

现象解决方法
人像脸部失真拍摄人物时使用 50mm 及以上焦距
主体模糊,背景清晰将 dof.focus_object 设为主体
相机正对主体中央使用三分法;偏移主体位置
环绕相机倾斜严重使用 Track-To 约束,而非手动旋转
动画中的相机低于地面添加 Floor 约束,或检查 Z 关键帧
Cycles 中景深渲染很慢最终渲染可以接受;视口可能使用更简单的近似效果

何时加载 references/overview.md

适用于:

  • 需要默认效果之外的电影效果:变形宽银幕、镜头光晕、暗角
  • 多摄像机场景(用于编辑的摄像机标记)
  • 摄像机抖动/手持噪声
  • 立体/VR 摄像机设置

该参考涵盖:完整的焦距理论、光圈/f 值表、构图指南、用于匹配真实摄像机(iPhone、电影摄影机、DSLR)的传感器变体、动态摄像机模式、电影效果。

评论

支持 Markdown