ZhangZhihui's Blog  

有个Blender插件叫fspy,可以根据一张照片计算出拍这张照片的相机的角度、焦距等信息,但这个插件从2019年起就没有再更新过了,有没有类似功能的其它插件?

 

虽然 fspy 官方很久没更新了,但它至今在很多老版本的 Blender 中依然可以通过安装社区修复版(例如 GitHub 上的 fspy-blender v1.0.3 适配版)来继续使用。

如果你想找现代、原生集成在 Blender 内部或者持续维护的替代方案,目前有几种主流的选择:

1. Blender 内置的“相机底片/背景图”手动对齐法(最稳妥的无插件方案)

其实新版 Blender 自身已经非常强大,很多时候不需要依赖 fSpy 导数据:

  • 做法: 在 3D 视图中直接拖入背景图片(或通过 Shift + A -> Image -> Reference / Background),然后开启透视视图。

  • 调整: 选中摄像机,在右侧属性面板中调整焦距(Focal Length)和摄像机坐标。配合视口中的网格和透视线,手动肉眼对齐建筑边缘。虽然没有 fSpy 自动解算那么极速,但对于绝大多数日常合成完全够用。

2. Camera Calibration PVR (社区现代化开源插件)

这是一款专门为现代 Blender 开发的相机标定与透视匹配插件。

  • 原理与 fSpy 类似: 它允许你在 Blender 视口中利用参考照片里的矩形或平行线(通过 Mesh 顶点或网格对齐),直接一键解算相机的焦距(Focal Length)、空间位置(Position)和旋转角度(Rotation)。

  • 优势: 它完美适配较新的 Blender 版本,且直接在 3D 视口内操作,省去了“导出一份 fSpy 独立软件再导回 Blender”的繁琐步骤。

3. Blender 官方的 Camera Calibration(内置相机校准工具,通常用于畸变和标定)

Blender 原生自带一些相机校准功能(多用于摄影测量或镜头畸变消除),虽然它侧重于通过网格标定板消除镜头畸变,但也能辅助处理部分透视匹配问题。

实用建议:

如果你依然非常留恋 fSpy 那种“画两条透视线就自动算出相机”的爽快感,目前在 Blender 5.2 中最省事的办法依然是去 GitHub 搜索下载 fspy-blender 的 1.0.3+ 社区修复版插件,它能够完美兼容较新版本的 Blender。如果追求全流程都在 Blender 内部搞定,可以尝试 Camera Calibration PVR 插件。

 

 

 

怎样安装Camera Calibration PVR插件?

 

安装 Camera Calibration PVR(全称:Camera Calibration using Perspective Views of Rectangles)插件的步骤如下:

第一步:下载插件压缩包

  1. 前往该插件的官方 GitHub 仓库(搜索 mrossini-ethz/camera-calibration-pvr)。

  2. 点击页面上的绿色按钮 Code,然后选择 Download ZIP,将源码压缩包下载到电脑中。

    注意:下载后检查一下文件名,确保文件名中除了后缀 .zip 之外,不要包含多余的点号(.),否则 Blender 在识别时可能会报错。

第二步:在 Blender 中安装

  1. 打开 Blender(如你提到的 5.2 版本)。

  2. 点击顶部菜单栏的 Edit(编辑) -> Preferences(偏好设置)

  3. 在弹出的窗口左侧点击 Add-ons(插件) 标签页。

  4. 点击窗口右上角的 Install(安装...) 按钮。

  5. 在弹出的文件浏览器中找到刚才下载的 ZIP 压缩包,选中它并点击 Install Add-on

第三步:启用插件

  1. 安装完成后,插件列表会自动筛选出该插件。你也可以在搜索框中直接输入:Camera Calibration using Perspective Views of Rectangles

  2. 找到该插件后,勾选它左侧的复选框以启用。

  3. 如果希望每次打开 Blender 时插件都保持开启,可以点击左下角的小齿轮(偏好设置菜单)并勾选 Save Preferences(保存偏好设置)

插件在哪里找到?

启用成功后,它的控制面板通常会出现在右侧属性栏的 Scene(场景属性,图标是一个小场景/摄像机) 面板下方的 Camera Calibration PVR 卷展栏中。你可以导入参考照片并配合一个基础 Plane(平面)的四个顶点来对齐透视并计算相机焦距和位置。

 

 

PVR是什么意思?

 

矩形透视视图(Perspective Views of Rectangles)

在前面提到的 Camera Calibration PVR 插件中,PVR 是其核心算法的英文缩写(Perspective Views of Rectangles)。它的意思是通过照片中矩形物体的透视畸变(例如地砖、窗户、画框等),来逆向解算拍摄该照片时的相机焦距、三维位置和旋转角度。

 

 

 

安装完Camera Calibration PVR插件后,在Scene面板找到了Camera Calibration PVR 卷展栏,选择了Image,点击"Solve Focal",报错:Selected object must be a mesh with 4 vertices in 1 polygon。

 

这个报错意思是:你当前选中的物体必须是一个“包含一个多边形、且恰好有 4 个顶点”的网格物体(Mesh)

Camera Calibration PVR 插件的核心工作原理,是让你用一个标准的四边形(比如一张正方形的平面 Plane)去对齐照片里的矩形物体(如窗户框、地砖、墙面、画框等),从而利用这个矩形的透视畸变来解算相机的焦距。

出现这个报错,通常是因为你当前选中的物体不符合要求。请按照以下步骤检查并调整:

1. 确保选中的是一个标准的平面(Plane)

  • Shift + A -> Mesh(网格) -> Plane(平面),创建一个全新的平面。

  • 确保你只选中了这个 Plane,没有多选或选错成别的物体(比如相机、灯光或空物体)。

2. 检查顶点的数量(不能多也不能少)

  • 默认创建的 Plane 只有 4 个顶点,这没问题。

  • 千万不要对这个 Plane 做过细分(Subdivide)、切角(Bevel)或者添加多余的边,否则它的顶点数会超过 4 个,或者变成多个多边形。它必须是一个干净的、只有 4 个角顶点的简单矩形。

3. 正确的透视对齐操作流程

  1. 把照片导入到插件的 Image 中。

  2. 选中刚才创建的那个 4 顶点平面(Plane)

  3. 进入 Edit Mode(编辑模式,按 Tab 键)

  4. 移动这 4 个顶点(或者配合底图和透视线),分别对齐到照片中某个真实的矩形物体的四个角(例如一扇窗户的四个直角)。

  5. 切回 Object Mode(物体模式),保持这个 Plane 处于选中状态。

  6. 回到 Scene 面板的 Camera Calibration PVR 卷展栏,再次点击 "Solve Focal"

只要选中的是一个单纯的 4 顶点 Mesh,插件就能通过这 4 个点在空间中的透视变形成功计算出相机的焦距和位置!

 

 

报新的错误:The polygon in the mesh must be convex and may not be degenerate.

 

这个错误意思是:网格中的多边形必须是“凸多边形(Convex)”,且不能是“退化图形(Degenerate)”

你在编辑模式下移动那 4 个顶点来对齐照片时,导致了以下两种情况之一:

  1. 多边形发生了扭曲或交叉(非凸 / 凹多边形或自相交): 不小心把某两个顶点拉过了头,导致网格的边线交叉成了一个“蝴蝶结”或“沙漏”形状,或者产生了凹陷的内角。

  2. 图形退化(面积为零或成一条线): 把 4 个顶点拉到了同一条直线上,或者挤在同一个点上,导致这个平面失去了正常的二维面积。

解决方法

  1. 检查网格是否扭曲: 进入 Plane 的编辑模式(Tab),观察它的 4 条边是否围成了一个正常的、顺时针或逆时针首尾相连的四边形,确保没有任何边交叉

  2. 保证凸四边形: 四个角必须都是“外凸”的(类似于正常的矩形或平行四边形),不能有任何一个是向内凹进去的。

  3. 最快的重置方法: 如果当前的平面已经被拉扯得太乱,直接在物体模式下把它删掉 (X),然后重新按 Shift + A -> Mesh -> Plane 创建一个干净的正方形平面。这次在移动顶点时注意保持边线平顺,不要让边互相穿插。

 

 

我创建了一个新的Plane,将4个顶点对齐了图片上的一个窗户,在Object Mode下选中了这个Plane,报新的错误:Edges of the input rectangle must not be parallel.

 

这个错误是因为该插件的算法依赖于透视畸变(即消失点和收敛线)来逆向计算相机的焦距。如果所选四边形的相对两边在屏幕上看起来是平行的(或者你把它们对齐成了规则的矩形/正方形),算法就会因为缺少透视数据而无法求解。

出现这个报错通常对应两种实际情况:

  1. 照片拍摄角度是正对的(无透视畸变): 如果那扇窗户是摄影师正对著、平视拍下来的(没有明显的远小近大或斜视角度),它的边缘在画面中几乎是平行的。在这种情况下,单张照片的透视矩形法在数学上无法解算出焦距。

  2. 顶点的对齐方式不对: 窗户在照片中其实是有透视角度的(呈不规则的梯形),但你在调整顶点时,把这个平面“摆正”或拉成了平行的常规矩形,导致相对的边在屏幕像素上平行了。

解决方法

  1. 检查照片选择: 确保你用来校准的照片中,那个矩形物体(窗户、地砖或墙面)是处于有角度的透视状态的(即能看到明显的线条向远处汇聚成消失点),而不是死板的正面平视照。

  2. 恢复真实的透视形状: 进入 Plane 的编辑模式,不要把它拉成规则的长方形,而是让它的 4 个顶点严格贴合照片中那个因透视而变形的梯形轮廓。让相对的边保持原本在画面中的倾斜和收敛趋势,绝对不要让它们平行。

 

 

刚才我的参考照片是在按完1后插入的,是处于正交图模式,我稍微调整了一下角度让它牌透视图模式,但还是报新的错误:Selected object must be a mesh with one polygon of 4 vertices with two dangling vertices.

 

这个错误说明你点击了需要额外几何辅助线的按钮(例如 Solve Focal+YSolve Focal+X+Y,这些模式用于计算镜头位移),插件此时正在寻找带有“悬挂顶点(dangling vertices)”的特殊网格,而你当前只是一个普通的 4 顶点平面。

解决方法

  1. 改回基础求解按钮: 如果你只需要对齐普通的窗户透视,请确保在 Scene 面板的 Camera Calibration PVR 卷展栏里,点击的是最基础的 "Solve Focal" 按钮,而不是带有 +Y+X+Y 后缀的高级按钮。

  2. 如果你执意要用高级模式(如 Solve Focal+Y): 该模式要求你在基础的四边形上,额外向外挤出(Extrude,按 E 键)一条垂直于该平面的边或顶点(即“悬挂顶点”),用来提供空间方向参考。但对于绝大多数普通照片,退回并点击 "Solve Focal" 即可。

 

 

还是报Edges of the input rectangle must not be parallel错误,我觉得可能是因为这张照片是近距离拍摄,透视效果不明显,所以计算不出焦距。

 

你的直觉非常准确,这正是问题所在。

当照片是近距离平视拍摄、或者使用中长焦镜头时,画面中的透视变形会非常微弱。在数学算法的眼中,如果四边形的相对两边在屏幕上几乎没有夹角(趋于平行),对应的消失点(Vanishing Point)就会跑向无限远,导致三角函数无法解算出合法的焦距。

为什么会出现这个错误

Camera Calibration PVR 插件(以及所有基于透视几何的相机标定算法)强依赖于透视收敛。它需要通过两条相交的延长线来计算相交的消失点。如果你的四边形选得太规整、或者照片本身缺乏透视斜度,算法就会直接报错拒绝计算。

解决这个问题的可行方案

  1. 更换一张具有强烈透视特征的照片: 挑选那些透视关系明显的照片来做测试,例如:

    • 站在房间角落拍摄的墙面和地板交界线。

    • 仰拍整栋建筑时,墙体边缘向天空急剧收窄的画面。

    • 一条向远处延伸的街道、走廊或铁轨。

  2. 如果必须用这张照片,放弃插件改为手动对齐: 如果这张照片本身就拍得很平、没有透视畸变,强行用 PVR 插件是解算不出来的。此时建议卸下插件的自动求解,直接在 Blender 里把这张图作为相机背景(Background Images),然后手动调整相机的焦距(Focal Length,比如设为经典的 35mm 或 50mm)并平移旋转相机,靠肉眼把物体和模型对齐。

 

 

什么是悬挂顶点(dangling vertices)?

 

在三维建模和网格拓扑中,悬挂顶点(Dangling Vertices,也常包含悬挂边)是指那些没有完整闭合进主网格结构、而是像“尾巴”一样单独延伸出去的顶点或边。

具体到你使用的 Camera Calibration PVR 插件中:

  • 常规状态下: 插件只需要一个标准的 4 顶点平面(构成 1 个封闭的面)。

  • 触发该报错的原因: 你点错了高级求解按钮(例如带有 +Y+X+Y 后缀的按钮,如 Solve Focal+Y)。这些高级模式用于计算相机的镜头平移(Lens Shift),算法在数学上需要更多的辅助参考线。因此,它会强制要求你在基础的四边形上额外挤出(Extrude)或延伸出两条带有特定方向的边(即所谓的“悬挂顶点/边”)来提供空间坐标轴参考。

如果你只是想进行最基础的透视和焦距对齐,无需使用这些高级模式,退回并点击最基础的 "Solve Focal" 按钮即可。

 

 

在Viewpoint中按1,然后加入reference image,创建一个Plane作为地面,怎样让这个Plane地面与reference image中的地面对齐?

 

要让创建的 Plane 地面与背景的 Reference Image(参考图)完美对齐,核心思路是:通过调整相机(Camera)的位置与透视,或者直接调整 Plane 的旋转与缩放,让 3D 视口中的虚拟网格和背景图重合。

具体取决于你是想“用相机对齐图片”还是“用物体对齐图片”,通常有两种非常顺手的操作方法:

方法一:通过 Camera 背景图对齐(最标准、最适合后续建模)

如果你已经导入了一张参考图,并且打算以它为底图进行搭建:

  1. 切换到相机视图: 按小键盘的 Numpad 0(或点击视口右上角的相机图标),进入摄像机视角。此时背景图会作为相机的背景显示。

  2. 选中相机并调整焦距: 选中摄像机,在右侧属性面板的 Camera 数据面板(绿色相机图标) 中,找到 Lens -> Focal Length(焦距)。根据照片的实际拍摄习惯调整(例如宽景用 24mm/35mm,人像或远景用 50mm/85mm)。

  3. 摆放地面(Plane):

    • 回到透视视图(Numpad 5 或旋转视口),按 Shift + A -> Mesh -> Plane 创建一个平面。

    • 因为默认创建的 Plane 是水平铺在 X-Y 平面上的,如果照片里地面是水平的,这个 Plane 大体方向就已经对了。

    • 使用 G(移动)R(旋转)S(缩放) 键,将 Plane 的边缘和透视网格,与背景图中地面的边界(如地砖缝、墙角线)进行肉眼对齐。

方法二:直接将图片作为“参考图(Reference Image)”拖入 3D 视图(最直观)

如果你是通过 Shift + A -> Image -> Reference 将图片直接拖进 3D 视口里的(它会作为一个带有材质的空物体平面存在):

  1. 对齐到视口视角:Numpad 1(正前方/正交前视图)或 Numpad 7(正上方/正交顶视图),先让你的 3D 视口方向和图片的拍摄角度大致对应。

  2. 直接旋转/移动参考图:

    • 选中那张图片物体,按 R(旋转),让图片的地面部分转到水平方向。

    • G(移动) 把它摆放在合适的位置。

  3. 创建并对齐 Plane:

    • Shift + A -> Mesh -> Plane 创建地面。

    • 进入编辑模式或直接在物体模式下,通过 S(缩放)R(旋转),让这个 Plane 的网格大小和参考图里的地面区域完全贴合。

小技巧:

  • 在对齐时,可以按住 Shift进行微调(能让移动和缩放变得非常平缓精准)。

  • 如果嫌参考图太亮或者挡住视线,可以选中参考图,在右侧属性面板的 Object Data 属性(一个类似小方块/图片的图标) 中勾选 Opacity(不透明度) 并降到 0.5 左右,这样就能透过图片隐约看到你建的 Plane 顶点。

 

 

 

我发现fspy中的坐标系与Blender的坐标系不一致,fspy的x轴正向与Blender的x轴正向方向相反,这样从fspy中导出的文件再导入Blender中,显示的相机角度还是正确的吗?

 

即使 fSpy 内部的坐标系与 Blender 存在差异,只要使用官方的 fSpy-Blender 导入插件,导进 Blender 后的相机角度和空间位置依然会是完全正确的。

fSpy 的 Blender 导入插件在底层会自动进行坐标系的数学转换。只要你在 fSpy 中拉出的三维坐标轴方向是对的(例如确保蓝色 Z 轴指向上方,红绿轴分别对应场景的长和宽),导入脚本就会自动把这些数据映射到 Blender 的右手坐标系(Z 轴向上)中,确保生成的相机和背景图完美吻合。

 

 

我从fspy中导入文件Cabin.fspy,然后将其导入Blender,发现其Z坐标值为负,需要手动改为正值位置才合理,我觉得正是这个坐标系差异导致的。

 

你的直觉非常敏锐,这个现象确实与坐标系的底层定义差异直接相关!

为什么在 Blender 里 Z 坐标会变成负数?

  • fSpy 与 Blender 的坐标系差异:

    fSpy 默认采用的是类似于传统计算机图形学或部分三维软件的坐标系,其深度视线方向(通常是 Z 轴)的朝向与 Blender 相反

  • 导入插件的处理逻辑:

    官方的 fSpy-Blender 导入插件虽然会通过矩阵转换把相机的旋转角度(Rotation)焦距正确换算过来,但在处理相机的平移/位置(Location)时,有时因为导入时的缩放或坐标轴翻转不完全,导致相机的深度(Z 轴或 Y 轴距离)变成了负值。

虽然相机的“镜头朝向和角度”在视觉上可能是对的,但由于它的空间中心跑到了原点的另一侧(负半轴),如果你后续往场景里直接拖入物体(默认生成在 $Z=0$ 或正上方),就会发现它们和相机的相对位置全乱了,必须手动把 Z 坐标修正为正值。

 

posted on 2026-08-30 21:33  ZhangZhihuiAAA  阅读(15)  评论(0)    收藏  举报