3dcg 宽景图小试

Originally published at: 3DCG 宽景图小试 – Foo "Raspberry" Barz


利用 3D 软件制作类宽景/全景效果的图片。

什么是宽景、环景和全景图?

全景图(panorama)是一种广角图,可以以画作、照片、影片、三维模型的形式存在。全景图这个词最早由爱尔兰画家罗伯特·巴克提出,用以描述他创作的爱丁堡全景画。现代的全景图多指通过相机拍摄并在电脑上加工而成的图片。

  • 宽景照片的画面比普通的广角的水平视角大,却又未涵盖到整个周围360° 。
  • 环景源自于传统平面的概念,水平视角包含完整一周360°,但受限于二度空间,无法完整呈现出置身于球体,或是立方体内部的那种三维的立体空间之视觉效果。在多重照片接合时,离画面中地平线上下越远,变形会越大,需要将照片的中线固定、上下端都左右来开来接合图片,而直线将呈现曲型。
  • 于球体的空间状态,视角涵盖地平线+/-各180°,垂直+/-各90°,就立方体的空间状态,即为上下前后左右六个面完全包含。由于水平角度为360°,垂直为180°,能表达这种模式的照片有很多种,又跟球面的投影有关(类似绘制世界地图的投影,但是是内投影)。目前最广泛使用的单一照片呈现法式等距长方投影(equirectangular),全景照片的长宽比例固定为2:1。

台北市的横向宽景照片,来自 File:Taipei skyline sunset.jpg - Wikimedia Commons

拍摄和合成一张宽景/全景照片的步骤

虽然这一次是要用 3D 软件合成宽景照片,这步骤也是 GPT 总结的,但是实地拍摄照片的流程也许会有帮助?

  1. 选择景点:选择一个你想要拍摄的景点,最好选择那些风景开阔、视野广阔的地方。
  2. 准备设备:你需要一台具有全景模式的相机或者手机。如果没有,你也可以拍摄一系列的照片,然后通过软件来合成全景照片。
  3. 拍摄:站在一个固定的位置,将相机或手机平稳地从一个方向向另一个方向移动。确保每张照片都有一部分是和前一张照片重叠的,这样在合成全景照片时,会更加自然和连贯。
  4. 合成全景照片:将你拍摄的照片导入到电脑中,然后使用全景照片合成软件如Photoshop、Lightroom、Microsoft ICE等将它们合成一张全景照片。这些软件通常都有自动对齐和混合功能,可以帮你轻松地完成全景照片的合成。
  5. 调整和优化:最后,你可以对全景照片进行调整和优化,例如调整亮度、对比度、色彩等,使全景照片更加完美。

用 MMD 制作一张纵向宽景图

于是接下来就是来实际操作一次了。

  • 当然首先要把场景摆好。

生成用于合成的中间图像

  • 接下来,像拍摄全景照片一样选择一个起始位置。
    • 例如最下方,中间和最上方。
    • 就像结合环景照片时离画面中地平线上下越远,变形会越大一样,越远离起点的地方在组合后的图片上会越小。你也许想要尽可能的让主体位于画面的中央。
    • 适当减小视野角也有助于缓解变形,但也许会增加中间图像的数量和延长后期处理需要的时间。
    • 距离应该是 0 ,其它的距离设定可能会产生一些预料之外的效果。
  • 有需要的话,你也可以调整输出的分辨率。
    • 当然想要输出越大的中间图像,就需要越多的内存和显存 :smiling_face_with_tear:
    • 调整分辨率的同时也会调整视野,你也许应该在设置好输出分辨率后再选择起始点。

  • 旋转 X 轴若干度,每次旋转之后输出一张中间图片。

如果你有一些命令行操作的技巧的话,下面的做法也许能帮你减少一些重复输出每一张中间图片的时间。

以及下面的操作要求安装适用于 Linux 的 Windows 子系统,至于选择什么发行版并没有什么关系,只要可以使用 ffmpeg 就可以了。

或者如果你有其它的把视频输出成每一帧的图片的方法的话也可以用,我就没再研究其它的方法了。

  • 选择另一个关键帧,旋转视野到宽景结束的位置(别忘了登录)。
    • 我的习惯是默认的视野角设置(30 度)的话每 10 度间隔一帧,如果你的中间图像十分窄(例如为了绕过 MMD 的输出大小限制等原因),你也许希望减小每一关键帧移动的角度。
  • 输出起点到终点范围的视频。
    • 如果你在后面合成图像时遇上了不能输出成一张图像的问题,增大输出时的帧率也许会有帮助。
    • 但是增大帧率也会增加中间图像的数量和延长后期处理需要的时间,所以如果增大帧率还是无法合成一张图片的话,可能需要调整视野角和输出分辨率等设置。

  • 通过 ffmpeg 输出逐帧图像。
# ffmpeg -i <输出的视频文件名> <文件名的格式> 
# -hide_banner 可以隐藏一些多余的日志输出。
# 这个格式会产生 001.png 这样的输出。
$ ffmpeg -i temp.avi %03d.png -hide_banner

合成宽景图像

  • 我这里使用的是 Affinity Photo。
    • 如果你习惯 Photoshop 的话,应该也有类似的方式可以做到,
    • Affinity 的帮助在这里: Affinity Photo 帮助
  • 选择刚刚输出的中间图像输出全景,如果合适的话,预览里应该会是一张图片。

  • 点击“确定” 并等待渲染全景完成。

  • 如果有需要的话,可以在确认渲染效果以后进行一些调整。以及裁剪掉边角。

  • 然后就可以输出成果了。

不同的起点位置对输出结果的影响?

下面是向上移动 0 度时的位置的不同效果。

其它的玩法?

例如调整 Z 轴位置达成接近主视角的效果:

  • 把旋转中心设为想要主视角效果的模型上也许也可以?但是我日常的风格都是第三人称视角所以没有仔细尝试。

或者转到人物身后:

侧面视角说不定也不错:

总之就是很有自由发挥的空间 :upside_down_face:

合成横向宽景图

操作和纵向的类似,只是这回要旋转 Y 轴。

(虽然这个效果用纵向应该也能合成出来吧)

One More Thing

算是个综合题?