3D图形是如何工作的

作者:Curt Franklin
3D图像最初是一个简单的形状,称为线框图。
2008 十万个为什么

您可能正在电脑显示器屏幕上阅读本文——这是一个具有两个真实维度(高度和宽度)的显示器。但是,当您观看《玩具总动员2》之类的电影或玩《古墓丽影》之类的游戏时,您会看到一个通往三维世界的窗口。这个窗口真正令人惊奇的一点是,您看到的世界可以是我们生活的世界,可以是明天我们将生活的世界,也可以是电影或游戏创作者脑海中才存在的虚拟世界。所有这些世界都可以出现在您用于撰写报告或跟踪股票投资组合的同一个屏幕上。

您的电脑是如何欺骗您的眼睛,让您以为扁平的屏幕能延伸到一系列深远的房间中?游戏程序员又是如何让您相信您看到的是真实角色在真实风景中移动?我们将告诉您3D图形设计师使用的一些视觉技巧,以及硬件设计师如何让这些技巧快速实现,使其看起来就像一部对您的每一个动作做出反应的电影。

广告

是什么让图片呈现3D效果?

具有或看起来具有高度、宽度和深度的图片是三维(或3D)的。只有高度和宽度而没有深度的图片是二维(或2D)的。有些图片是特意做成2D的。例如,想想指示洗手间方向的国际符号。这些符号的设计旨在让您一目了然。这就是它们只使用最基本形状的原因。符号上的额外信息可能会试图告诉您小人或小女人穿什么样的衣服,头发的颜色,他们是否经常去健身房等等,但所有这些额外信息都会让您更长时间才能从符号中获取基本信息:哪个是男洗手间,哪个是女洗手间。这是2D和3D图形使用方式的基本区别之一:2D图形擅长非常快速地传达简单信息。3D图形讲述更复杂的故事,但需要携带更多信息才能做到这一点。

例如,三角形有三条边和三个角——这是讲述一个三角形所需的所有信息。然而,金字塔是一个具有四个三角形侧面的3D结构。请注意,讲述一个金字塔的故事需要五条边和六个角——几乎是讲述一个三角形所需信息的两倍。

广告

数百年来,艺术家们已经掌握了一些技巧,可以将扁平的2D绘画变成一个通向真实3D世界的窗口。您可以在扫描后在电脑显示器上查看的照片中看到其中一些技巧:物体离得越远显得越小;当靠近相机的物体聚焦时,远处的物体会模糊;颜色越远越不鲜艳。然而,当我们今天谈论电脑上的3D图形时,我们谈论的不是静止的照片——我们谈论的是会动的图片

如果将2D图片制作成3D图像需要添加大量信息,那么从3D静止图片到逼真动态图像的飞跃则需要更多信息。部分问题在于我们已经被惯坏了。我们期望所看到的一切都具有高度的真实感。在20世纪70年代中期,《Pong》这样的游戏凭借其屏幕图形就能给人留下深刻印象。如今,我们将游戏画面与DVD电影进行比较,并希望游戏能像我们在电影院看到的那样流畅和精细。这给PC、Macintosh以及越来越多地,像Dreamcast和Playstation II这样的游戏机上的3D图形带来了挑战。

广告

什么是3D图形?

对我们许多人来说,电脑游戏或高级游戏系统是我们看到3D图形最常见的方式。这些游戏,或由电脑生成图像制作的电影,需要经过三个主要步骤来创建和呈现逼真的3D场景

  1. 创建一个虚拟3D世界。
  2. 确定屏幕上将显示世界的哪一部分。
  3. 确定屏幕上的每个像素将如何显示,以使整个图像看起来尽可能逼真。

创建虚拟3D世界

虚拟3D世界与该世界的一张图片不同。这在我们的现实世界中也同样适用。以现实世界中一个非常小的部分为例——您的手和手下的桌面。您的手具有决定其如何移动和如何呈现的特性。手指关节向手掌方向弯曲,而不是向外。如果您将手拍在桌面上,桌面不会溅起水花——它始终是坚固和坚硬的。您的手不能穿过桌面。您无法通过查看任何一张图片来证明这些事情的真实性。但无论您拍多少张照片,您都会发现手指关节只向手掌方向弯曲,桌面始终是坚固的,不是液体的,是坚硬的,不是柔软的。这是因为在现实世界中,手就是这样的,它们将永远这样运作。然而,虚拟3D世界中的物体并不像您的手那样自然存在。它们是完全合成的。它们唯一的属性是由软件赋予的。程序员必须使用专用工具并极其谨慎地定义一个虚拟3D世界,以使其内部的一切始终以某种方式运行。

广告

虚拟世界的哪一部分显示在屏幕上?

在任何给定时刻,屏幕仅显示为电脑游戏创建的虚拟3D世界的一小部分。屏幕上显示的内容由世界定义方式、您选择去哪里以及您选择看向哪个方向共同决定。无论您走向何方——向前或向后,向上或向下,向左或向右——您周围的虚拟3D世界都会决定您从该位置看向该方向时会看到什么。并且您所看到的一切必须在场景之间保持连贯。如果您从相同距离观察一个物体,无论方向如何,它都应该看起来高度相同。每个物体都应该以一种方式呈现和移动,以使您相信它始终具有相同的质量,无论其硬度、柔软度、刚性或柔韧性如何等等。

编写电脑游戏的程序员投入巨大精力来定义3D世界,这样您就可以在其中漫游,而不会遇到任何让您觉得“这在这个世界中不可能发生!”的情况。您最不想看到的是两个固体物体能够相互穿过。这会严酷地提醒您,所看到的一切都只是虚构。

第三步涉及的计算量至少与前两步相同,并且对于游戏和视频来说必须实时发生。我们将在下文中详细探讨它。

 

广告

如何使其看起来像真实事物

此图显示了一只由相对较少的多边形(总计862个)制成的手的线框图。
十万个为什么.com

无论虚拟3D世界多么庞大或丰富,计算机只能通过在2D屏幕上放置像素来描绘该世界。本节将重点介绍屏幕上显示的内容如何变得逼真,特别是场景如何尽可能接近您在现实世界中看到的样子。首先,我们将探讨如何使单个静止物体看起来逼真。然后,我们将针对整个场景回答相同的问题。最后,我们将考虑计算机需要做什么才能显示以逼真速度移动的逼真图像的全动态场景。

许多图像元素共同作用,使物体看起来真实。其中最重要的包括形状、表面纹理、光照、透视、景深和抗锯齿。

广告

形状

线框图的轮廓可以做得更自然、更圆润,但这需要更多的多边形——3,444个。
十万个为什么.com

当我们向窗外看时,我们看到由各种形状组成的场景,包含各种大小和组合的直线和曲线。同样,当我们在电脑显示器上观看3D图形图像时,我们看到由各种形状组成的图像,尽管它们大部分由直线构成。我们看到正方形、长方形、平行四边形、圆形和菱形,但最常见的是三角形。然而,为了构建看起来具有自然界常见平滑曲线的图像,有些形状必须非常小,并且一个复杂的图像——例如,一个人体——可能需要将数千个这些形状组合成一个称为线框图的结构。在这个阶段,该结构可能被识别为它最终将描绘的符号,但下一个重要步骤是:线框图必须被赋予一个表面。

表面纹理

在线框图上添加表面,图像就开始从明显的数学图形转变为我们可能识别为一只手的图片。
十万个为什么.com

当我们在现实世界中遇到一个表面时,可以通过两种主要方式获取信息。我们可以观察它,有时从多个角度,我们也可以触摸它,看它是硬是软。然而,在3D图形图像中,我们只能通过观察表面来获取所有可能的信息。所有这些信息可以分解为三个方面

 

  • 颜色:它是什么颜色?它整体颜色一致吗?
  • 纹理:它看起来光滑吗?或者表面是否有线条、凸起、凹陷或其他不规则之处?
  • 反射率:它反射多少光线?表面上其他物体的反射是清晰还是模糊?

让图像看起来“真实”的一种方法是让图像的不同部分具有这三种特征的广泛变化。现在看看您周围:您的电脑键盘与您的桌面具有不同的颜色/纹理/反射率,而您的桌面又与您的手臂具有不同的颜色/纹理/反射率。为了获得逼真的颜色,计算机能够为构成图像的像素选择数百万种不同的颜色非常重要。纹理的多样性既来自于从青蛙皮肤到果冻布丁等表面的数学模型,也来自于应用于表面的预存“纹理贴图”。我们还将我们看不见的品质——柔软、坚硬、温暖、寒冷——与特定的颜色、纹理和反射率组合联系起来。如果其中一项出错,现实的幻觉就会被打破。

我们将在下一节中探讨光照和透视。­

广告

光照与透视

图像中的光照不仅通过阴影为物体增加了深度,还通过投射阴影将物体“固定”在地面上。

当您走进房间时,您会打开。您可能不会花很多时间思考光线如何从灯泡或灯管发出并扩散到房间四周。但制作3D图形的人必须考虑这一点,因为线框图周围的所有表面都必须从某个地方被照亮。一种称为光线追踪的技术,它描绘了假想光线从灯泡发出、从镜子、墙壁和其他反射表面反弹,并最终以不同强度从不同角度落在物体上的路径。当您只考虑单个灯泡的光线时,这已经足够复杂了,但大多数房间都有多个光源——几盏灯、吸顶灯、窗户、蜡烛等等。

光照在赋予物体重量感和实体感方面发挥着关键作用,主要通过两种效果:明暗和阴影。首先是明暗,当光线照射到物体时,其一侧比另一侧更强。正是这种明暗效果使球看起来是圆的,高颧骨显得突出,毯子的褶皱显得深邃柔软。这些光线强度的差异与形状协同作用,增强了物体不仅具有高度和宽度,而且具有深度的错觉。重量感则来自第二种效果——阴影。

广告

当光线照射到实体时,它们会投下阴影。当您观察日晷或树木投射在人行道上的阴影时,就可以看到这一点。由于我们习惯于看到真实的物体和人物投下阴影,因此在3D图像中看到阴影会增强我们正在透过窗户看真实世界的感觉,而不是在看一个数学生成的形状屏幕。

透视

透视是那些听起来很专业但实际上描述的是每个人都见过的简单效果的词语之一。如果您站在一条笔直长路的旁边,看向远方,路的两边似乎在地平线处汇聚成一点。此外,如果树木站在路边,远处的树木会比您附近的树木看起来更小。事实上,树木看起来像是汇聚到路边形成的那个点上。当场景中的所有物体看起来最终都会在远处的一个点汇聚时,那就是透视。虽然存在变体,但大多数3D图形都使用刚才描述的“单点透视”。

在插图中,手是分开的,但大多数场景都包含一些物体在另一些物体前面,部分遮挡了视线。对于这些场景,软件不仅必须计算物体的相对大小,还必须知道哪个物体在前,以及它遮挡了其他物体的多少。计算这些因素最常用的技术是Z-缓冲区。Z-缓冲区得名于表示轴或假想线的通用名称,该轴线从屏幕穿过场景一直延伸到地平线。(还有另外两个常见轴需要考虑:X轴,用于测量场景的左右;Y轴,用于测量场景的上下。)

Z-缓冲区根据包含多边形的物体与场景前方的距离,为每个多边形分配一个数字。通常,靠近屏幕的物体被分配较低的数字,而靠近地平线的物体被分配较高的数字。例如,一个16位的Z-缓冲区会将-32,768分配给尽可能靠近屏幕的物体,将32,767分配给尽可能远的物体。

在现实世界中,我们的眼睛无法看到被其他物体遮挡的物体,所以我们没有弄清楚应该看到什么的问题。但计算机不断面临这个问题,并以直接的方式解决它。当每个物体被创建时,它的Z值会与占据相同X和Y值的其他物体进行比较。Z值最低的物体被完全渲染,而Z值较高的物体在它们相交的地方不被渲染。这个结果确保我们不会看到背景物体穿透前景人物的中间出现。由于Z-缓冲区在物体完全渲染之前就被使用,因此隐藏在人物或物体后面的场景部分根本不需要渲染。这加快了图形性能。接下来,我们将探讨景深元素。

广告

景深

另一种成功用于创建3D效果的光学效果是景深。以我们路边树木的例子为例,当那排树木变得越来越小时,还会发生另一件有趣的事情。如果您看靠近您的树木,远处的树木就会显得失焦。当您观看树木的照片或电影时,这一点尤其明显。电影导演和计算机动画师使用这种景深效果有两个目的。第一个是增强您正在观看的场景中的深度错觉。计算机当然可以确保场景中的每个物体,无论它应该有多近或多远,都完美对焦。但是,由于我们习惯了看到景深效果,所以无论距离远近所有物体都对焦会显得陌生,并会干扰观看真实世界场景的错觉。

导演使用景深的第二个原因是将您的注意力集中在他们认为最重要的物品或演员身上。例如,为了将您的注意力引向电影女主角,导演可能会使用“浅景深”,即只有演员是清晰的。另一方面,旨在通过大自然宏伟景象给您留下深刻印象的场景,可能会使用“深景深”以尽可能多地将物体置于焦点并使其引人注目。

广告

抗锯齿

另一种依赖于欺骗眼睛的技术是抗锯齿。数字图形系统非常擅长创建在屏幕上垂直或水平的直线。但当出现曲线或对角线时(它们在现实世界中相当常见),计算机可能会产生类似于楼梯台阶而不是平滑流动的线条。因此,为了欺骗您的眼睛看到平滑的曲线或线条,计算机可以在线条周围的像素中添加线条颜色的渐变阴影。这些“灰度化”的像素会欺骗您的眼睛,让您认为锯齿状的台阶消失了。这种通过添加额外彩色像素来欺骗眼睛的过程称为抗锯齿,它是将计算机生成的3D图形与手绘图形区分开来的技术之一。跟上线条在颜色区域中的移动,并添加适量的“抗锯齿”颜色,是计算机在您的显示器上创建3D动画时必须处理的另一项复杂任务。

当图像由直线像素绘制时出现的锯齿状“阶梯”使得一个物体明显是计算机生成的。
在图像线条周围绘制灰色像素——“模糊”线条——可以最大限度地减少阶梯状效果,使物体看起来更逼真。

我们将在接下来的章节中了解如何制作3D图像动画。

广告

真实示例

当我们迄今为止讨论过的所有技巧结合在一起时,就能创造出极具真实感的场景。在最近的游戏和电影中,计算机生成的物体与摄影背景相结合,进一步增强了这种幻觉。当您比较照片和计算机生成的场景时,您会看到惊人的结果。

这是How Stuff Works办公室附近人行道的一张照片。在接下来的图片中,有一个球被放置在人行道上并被拍摄下来。在另一张图片中,一位艺术家使用计算机图形程序创建了一个球。

广告

图片 A
图片 B

您能分辨哪个是真实的球吗?请在文章末尾寻找答案。

广告

让3D图形动起来

到目前为止,我们一直在探讨如何让任何数字图像看起来更真实,无论是单个“静止”图片还是动画序列的一部分。但在动画序列中,程序员和设计师会使用更多技巧来呈现“真实动作”的效果,而不是仅仅是计算机生成的图像。

每秒多少帧?

当您去当地影院看电影时,一连串被称为帧的图像会以每秒24帧的速度在您眼前闪过。由于您的视网膜保留图像的时间会比1/24秒稍长,大多数人的眼睛会将这些帧融合为单一、连续的运动和动作图像。

广告

如果从另一个角度思考,这意味着电影的每一帧都是以1/24秒的曝光时间拍摄的照片。这比“定格动作”摄影的曝光时间要长得多,在定格动作摄影中,跑步者和其他运动中的物体似乎凝固在空中。因此,如果您观看赛车电影的单帧画面,您会看到有些汽车是“模糊”的,因为它们在相机快门打开期间移动了。这种快速移动物体产生的模糊是我们习惯看到的,也是图像在屏幕上看起来真实的原因之一。

然而,由于数字3D图像根本不是照片,当物体在一帧内移动时,不会发生模糊。为了使图像看起来更逼真,程序员必须明确添加模糊效果。一些设计师认为,“克服”这种自然模糊的缺失需要每秒超过30帧,并已将其游戏推向每秒60帧的显示。虽然这允许每个单独的图像以极高的细节进行渲染,并且动作以更小的增量显示,但它极大地增加了给定动作序列必须渲染的帧数。举个例子,想象一场持续六分半钟的追逐。一部电影需要24(帧/秒)x 60(秒)x 6.5(分钟)或9,360帧来完成追逐。而一个每秒60帧的数字3D图像,在相同的时间长度内将需要60 x 60 x 6.5,或23,400帧。

创意模糊

程序员为增强动态图像真实感而添加的模糊被称为“运动模糊”或“空间抗锯齿”。如果您曾经开启过Windows的“鼠标轨迹”功能,您就使用过这种技术中一个非常粗糙的版本。移动物体的副本会留在其后面,随着物体移动得越来越远,这些副本变得越来越不清晰和不明显。物体轨迹的长度、副本消失的速度以及其他细节会根据物体预期的移动速度、其与观看者的距离以及它受关注的程度而有所不同。如您所见,要让一个物体看起来逼真地移动,需要做出大量决策并编程许多细节。

图像中还有一些部分,为了真实感,必须牺牲计算机的精确渲染。这适用于静止图像和动态图像。反射就是一个很好的例子。您见过镀铬表面汽车和宇宙飞船完美反射场景中一切的图像。虽然镀铬图像是光线追踪的绝佳演示,但我们大多数人并不生活在镀铬的世界中。木制家具、大理石地板和抛光金属都会反射图像,尽管不如光滑镜面那么完美。这些表面的反射必须进行模糊处理——每个表面接受不同的模糊——以便数字戏剧中围绕核心角色的表面能为动作提供一个逼真的舞台。

广告

对我们来说的流畅运动,却是计算机的艰巨工作

我们迄今为止讨论的所有因素都增加了在屏幕上显示3D图像的复杂性。首先,定义和创建对象更难,通过生成显示图像所需的所有像素来渲染它也更难。线框图的三角形和多边形、表面的纹理以及来自各种光源并从多个表面反射的光线都必须在软件开始告诉计算机如何绘制屏幕上的像素之前进行计算和组合。您可能认为当绘制开始时,计算的艰苦工作就结束了,但正是在绘制或渲染层面,数字才开始累积。

如今,1024 x 768的屏幕分辨率定义了“高分辨率”的最低点。这意味着有786,432个图像元素(即像素)需要绘制在屏幕上。如果有32位颜色可用,乘以32表明需要处理25,165,824位才能生成单个图像。以每秒60帧的速度移动,要求计算机每秒处理1,509,949,440位信息,仅仅是为了将图像显示在屏幕上。这与计算机决定图像内容、颜色、形状、光照以及图像其他所有方面以使屏幕上显示的像素实际显示正确图像所需的工作完全分开。当您考虑到仅仅是为了绘制图像就需要进行的所有处理时,很容易理解为什么图形显示卡越来越多地将图形处理从计算机的中央处理器(CPU)上转移开来。CPU需要所有能得到的帮助。

广告

变换与处理器:工作,工作,工作

仅仅查看构成屏幕所需的信息位数,只能部分了解所涉及的处理量。为了初步了解总处理负荷,我们必须谈谈一种称为变换的数学过程。每当我们改变看待事物的方式时,都会使用变换。例如,一辆汽车向我们驶来的图片,就是使用变换使其在移动时显得更大。变换的另一个例子是,当计算机程序创建的3D世界必须“扁平化”为2D以在屏幕上显示时。让我们看看这个变换(在3D游戏的每一帧中都会使用)所涉及的数学,以了解计算机正在做什么。我们将使用一些虚构的数字,但它们能让您对生成一个屏幕所涉及的惊人数学量有一个概念。不用担心学习如何做这些数学。那已经成了计算机的问题。所有这些都旨在让您对运行游戏时计算机所做的繁重工作有所了解。

过程的第一部分有几个重要变量

广告

  • X = 758 -- 我们所看“世界”的高度。
  • Y = 1024 -- 我们所看世界的宽度。
  • Z = 2 -- 我们所看世界的深度(从前到后)。
  • Sx = 我们看世界的窗口高度。
  • Sy = 我们看世界的窗口宽度。
  • Sz = 一个深度变量,用于确定哪些物体在其他隐藏物体前面可见。
  • D = 0.75 -- 在这个假想世界中,我们的眼睛与窗口之间的距离。

首先,我们计算进入这个假想世界的窗口大小。

现在窗口大小已经计算出来,接下来使用透视变换将世界投影到显示器屏幕上更进一步。在此下一步中,我们添加更多变量。

因此,三维假想世界中的一个点 (X, Y, Z, 1.0) 将变换为 (X', Y', Z', W'),我们通过以下方程得到

在这一点上,图像在投影到显示器屏幕上之前还必须应用另一个变换,但您已经开始看到所涉及的计算量——而这还仅仅是图像中的一个单一向量(线)!想象一下在一个包含许多物体和角色的复杂场景中的计算,再想象一下每秒进行60次这样的计算。您不觉得有人发明了计算机是件好事吗?

在下面的示例中,您将看到一个动画序列,展示了在How Stuff Works新办公室中漫步的场景。首先请注意,这个序列比大多数3D游戏中的场景简单得多。没有对手从办公桌后面跳出来,没有导弹或长矛在空中飞行,也没有咬牙切齿的恶魔在小隔间中显形。从“场景中有什么”的角度来看,这是一个简单的动画。然而,即使是这个简单的序列,也处理了我们迄今为止看到的许多问题。墙壁和家具具有覆盖线框结构的纹理。代表光照的光线为阴影提供了基础。此外,当视角在办公室漫步期间改变时,请注意有些物体是如何从角落里变得可见,并从墙壁后面出现的——您正在看到Z-缓冲区计算的效果。由于所有这些元素在图像实际渲染到显示器上之前都发挥作用,因此很明显,即使是强大的现代CPU,也需要一些帮助来处理3D游戏和图形所需的所有计算。这就是图形协处理器板的作用所在。

广告

显卡如何提供帮助

自从个人电脑诞生之初,大多数显卡都是翻译器,负责将计算机CPU创建的完整图像转换为驱动计算机显示器所需的电脉冲。这种方法有效,但图像的所有处理都由CPU完成——同时还要处理声音、玩家输入(用于游戏)以及系统的中断。由于计算机必须做所有这些事情才能实现现代3D游戏和多媒体演示,即使是最快的现代处理器也容易不堪重负,无法实时满足软件的各种要求。正是在这里,图形协处理器发挥了作用:它将工作与CPU分摊,从而使整个多媒体体验能够以可接受的速度运行。

如我们所见,构建3D数字图像的第一步是创建一个由三角形和多边形组成的线框世界。然后,线框世界从三维数学世界转换为一组将在2D屏幕上显示的模式。接着,变换后的图像被覆盖上表面(即渲染),由多个光源照亮,最后转换为在显示器屏幕上显示的模式。然而,当前一代图形显示卡中最常见的图形协处理器在线框图创建并转换为2D多边形集合后,将渲染任务从CPU上分担。在VooDoo3和TNT2 Ultra等显卡中发现的图形协处理器在此阶段接替CPU的工作。这是一个重要的步骤,但处于技术前沿的图形处理器被设计为在更早的阶段就减轻CPU的负担。

从CPU分担更多责任的一种方法是由Nvidia的GeForce 256实现的。除了早期显卡完成的渲染工作外,GeForce 256还增加了将线框模型从3D数学空间转换为2D显示空间的工作,以及显示光照所需的工作。由于变换和光线追踪都涉及大量的浮点数学运算(涉及小数的数学,称为“浮点”是因为小数点可以根据需要移动以提供高精度),这些任务极大地减轻了CPU的运算负担。而且由于图形处理器无需处理CPU预期的许多任务,因此它可以设计成非常快速地执行这些数学任务。

3dfx的新款Voodoo 5从CPU接管了另一组任务。3dfx将这项技术称为T-buffer。这项技术专注于改进渲染过程,而不是向处理器添加额外的任务。T-buffer旨在通过渲染同一图像的多达四个副本(每个副本略微偏移)来改进抗锯齿效果,然后将它们组合起来,轻微模糊物体的边缘,消除可能困扰计算机生成图像的“锯齿”。同样的技术也用于生成运动模糊、模糊阴影和景深焦点模糊。所有这些都产生了图形设计师想要的更平滑、更逼真的图像。Voodoo 5的设计目标是在保持快速帧率的同时实现全屏抗锯齿。

在看到常规、持续生成和呈现真正逼真的动态图像之前,计算机图形还有很长的路要走。但自80列25行单色文本时代以来,图形技术已经取得了巨大的进步。结果是,数百万人在今天的技术下享受着游戏和模拟。新的3D处理器将使我们更接近于感觉我们真的在探索其他世界,体验我们现实生活中从不敢尝试的事物。PC图形硬件的重大进展似乎每六个月左右发生一次。软件的改进则相对较慢。但显而易见的是,像互联网一样,计算机图形将成为电视越来越有吸引力的替代品。

回到球的图片。您做得怎么样?图片A是计算机生成的球。图片B显示的是人行道上真实球的照片。不容易分辨出哪个是哪个,对吧?

广告

加载中...