使用 POV-Ray 通过代码绘制 3D 图形

还没有读者喜欢这篇文章。
Green robot doll on a swing

Opensource.com

能够从任何角度和各种光照条件下观看的逼真 3D 物体图像,对于艺术家、设计师、建筑师、科学家和许多其他人来说都具有极大的价值。问题在于他们通常缺乏设备、技能或两者兼而有之来制作这些图像。

隆重推出 POV-Ray,开源 3D 图像渲染软件。

几年前的冬天,为了躲避恶劣天气,我(不是第一次)决定学习制作 3D 图像。虽然我涂鸦,高中时也上过美术课,但我的绘画并不出色,而且我以前尝试用鼠标或轨迹球绘画的经历都是灾难性的。我听说过的唯一可以制作精美 3D 作品的开源软件是 Blender,但我认为我需要比我拥有的更稳定的手,以及 Wacom 数位板。那么,我还能尝试什么呢?

我曾用多种编程语言编写代码来生成圆形、饼图、正弦波等。因此,考虑到这一点,以及编写原始 SVG 生成 2D 形状的一些经验,我寻找了开源软件,该软件允许我用键盘描述 3D 形状,而不是用鼠标绘制它们。

POV-Ray 入门

光线追踪器是一种通过数学预测光线将照射到物体的位置以及光线将被反射或吸收的位置来创建 3D 图像的程序。POV-Ray (Persistence of Vision Raytracer) 从基于文本的场景描述生成图像。查看 POV-Ray 名人堂 揭示了该程序能够产生的惊人的照片级真实感和超现实主义效果。

此外,POV-Ray 可以在一定程度上成为数据可视化工具,就像许多电子表格程序和其他应用程序用于生成原始数据的图形表示(例如饼图、条形图等)一样。由于 POV-Ray 图像是从脚本生成的,因此其他应用程序可以用于收集原始数据并将其格式化为脚本,然后 POV-Ray 可以使用这些脚本来生成最终图像。

Linux、Mac OS X 和 Windows 二进制文件 可用。

阅读了 POV-Ray 教程,该教程解释了如何创建基本形状并将它们连接在一起后,我能够制作一个简单的七秒动画视频。

灯光、摄像机、物体

为了实现 3D 真实感,观看者必须能够看到光和影以可信的方式表现。本教程首先解释了如何定位“摄像机”以表示观看者的视点,要观看的形状,以及照明以模拟形状投射的反射和阴影。

然后,本教程介绍了基本 3D 形状:球体、圆柱体、圆锥体、立方体和圆环(即甜甜圈)。这些形状可以通过重叠它们并取并集(逻辑 OR)、交集(逻辑 AND)或差集(逻辑 XOR)来组合。使用这些技术,例如,可以通过用立方体遮挡圆环来创建“半圆环”。将圆柱体连接到半圆环的每一侧,并添加另一个旋转 180° 的半圆环,即可形成链环。多个彼此旋转 90° 并适当偏移的链环可以形成链条。

本教程还讨论了纹理,但对于像我这样的初学者来说,制作像“木头”和“天空”这样的纹理相当复杂。幸运的是,POV-Ray 为许多预构建的流行纹理提供了宏。

以下是我如何创建对象和动画的。

你好,球体

将以下代码另存为名为 HelloSphere.pov 的文件。

// Annotated example from POV-Ray tutorial
// http://www.povray.org/documentation/3.7.0/t2_2.html#t2_2_1_6
//
// Generate PNG with:
//
//   $ povray +IHelloSphere.pov
//

#include "colors.inc"  // Include color name macros

background { color Cyan }

// Lights!
//
light_source {
  <2, 4, -3>           // X, Y, and Z coordinates of the light source
  color White
}

// Camera!
//
camera {
  location <0, 2, -3>  // X, Y and Z coordinates of the camera
  look_at  <0, 1,  2>  // X, Y and Z coordinates of where the camera is aimed
}

// Object!
//
sphere {
  <0, 1, 2>, 2         // X, Y, Z and radius of the sphere
  texture {
    pigment { color Yellow }
  }
}

在您喜欢的 shell 中发出命令 povray +IHelloSphere.pov 将生成如下所示的 HelloSphere.png

使用 POV-Ray 创建的球体https://open-source.net.cn/sites/default/files/hellosphere.png" style="width: 520px; height: 390px;" title="使用 POV-Ray 创建的球体" typeof="foaf:Image">

开始行动!

我最初并没有打算为我的实验制作动画,但在浏览 POV-Ray wiki 时,我找到了两篇文章表明这并非特别困难:HowTo:Create animationsHowTo:Encode animations as Ogg Theora Video

为了创建动画,POV-Ray 提供了一个“时钟”,它可以生成多个帧并将每个帧保存为 PNG 文件。对于每个帧,动画师可以移动物体、摄像机或照明,或所有三者的组合。创建帧文件后,必须将它们组合成单个电影文件。尽管似乎有几个应用程序可以帮助制作视频,但 wiki 文章推荐了两个可能不适用于 Windows 或 Mac OS X 的程序:png2yuv(由 mjpegtools 软件包提供)和 ffmpeg2theora(由 ffmpeg2theora 软件包提供)。

这两个程序一起捆绑单个静止图像并生成 Ogg 视频。

添加到 POV-Ray 脚本末尾的以下代码从时钟读取值,并为每个时钟滴答生成一个帧,同时围绕场景旋转摄像机并根据时钟值旋转对象。

// Animate!
camera {
  look_at  <0  10, 0>
  location <-35*sin(radians(clock*2)), 10, -35*cos(radians(clock*2))>
}
	
#declare Angle = 0;
#switch (clock)
  #range (0, 44)
    #declare Angle = clock;
  #break
  #range (45, 134)
    #declare Angle = 45 - (clock - 45);
  #break
  #range (135, 179)
    #declare Angle = (clock - 135) - 45;
  #break
#end
Rotate_Around_Trans(<Angle, 0, 0>, <0, 25.5, 0>)

为了使动画工作,第二个文件 (flying.ini) 控制时钟

Input_File_Name=flying.pov
Initial_Frame =   1
Final_Frame   = 180
Initial_Clock =   0.0
Final_Clock   = 179.0

使用 flying.pov 文件(描述形状和场景)和 flying.ini 文件(描述帧数和时钟速率),以下命令生成 180 个 PNG 图像,并将它们拼接在一起生成 Ogg Vorbis 视频

# Generate the 180 PNG images
povray +Iflying.pov flying.ini

# Create a YUV video from the PNG images (stills)
png2yuv -I p -f 25 -j flying%03d.png -b 1 > flying.yuv

# Convert the YUV video to an Ogg Vorbis video
ffmpeg2theora --optimize --videoquality 10 --videobitrate 16778 \
              -o flying.ogv flying.yuv

# Remove the temorary files generated above
rm flying0*.png flying1*.png flying.yuv

代码

  • flying.pov:通过描述形状、纹理、照明和摄像机移动来生成初始图像的代码。
  • flying.ini:为动画提供“时钟”和“帧速率”的代码。
  • film.sh:一个简短的 Bash 脚本,用于发出命令将 flying.pov 和 flying.ini “编译”成一系列 PNG 帧,然后将这些帧组合起来生成电影。

图像

命令 povray +Iflying.pov 生成了 flying.png

使用 POV-Ray 制作的飞行科米蛙https://open-source.net.cn/sites/default/files/flying.png" style="width: 520px; height: 390px;" title="使用 POV-Ray 制作的飞行科米蛙" typeof="foaf:Image">

电影

  • flying.ogv:生成的 Ogg 视频。它在 Firefox、Chrome 和 Android 手机上播放良好;其他浏览器可能需要 Ogg 插件才能播放。或者,只需查看下面上传的版本。
User profile image.
白天,担任 NOVA Web Development 的顾问。晚上和周末,他穿上他的服装(看起来非常像他平时穿的牛仔裤和 T 恤),外出与专有软件的力量作斗争。他是 Ubuntu DC “LoCo” 团队的联络人,也是前 OLPC Learning Club/Sugar Labs DC 的主持人之一。

3 条评论

这真是太酷了。仅用纯文本就能产生如此多的效果,真是太棒了。感谢您分享您的知识。

我找到了很多有用的信息,谢谢你们将这个网站添加到你们的收藏夹!

很高兴加入你们的社区!

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© 2025 open-source.net.cn. All rights reserved.