game-engine - 3D 游戏如何在没有每个角度的 Sprite 的情况下渲染对象?

标签 game-engine 3d-modelling

在学习编写简单的 2D 游戏时,每个对象都会有一个 Sprite 表,其中包含玩家在每一帧/动画中的外观的小图片。 3D 模型似乎不能以这种方式工作,否则我们需要为每个可能的对象 View 提供一张图像!

例如,一个旋转的立方体需要大量的图像来描绘它在每一面的外观。所以我的问题是,从任意角度查看时,引擎如何表示和渲染 3D 模型“图像”?

最佳答案

多种方法
有多种方法可用于渲染和存储 3D 图形和模型。甚至还有不同的渲染 2D 图形的方法!除了二维位图,您还有 SVG . SVG 使用数字来定义图像中的点。这些点形成形状。这些点还可以定义曲线。这使您无需像素即可制作图像。除了能够在不引起失真的情况下转换图像(缩放和旋转)之外,结果还可以是更小的文件大小。大多数 3D 图形使用类似的技术,但 3D 除外。然而,这些方法的共同点是,它们最终都将数据渲染到 2D 像素网格。
投影
渲染 3D 模型最常用的方法是 projection .所有要渲染的形状都分解为 triangles在渲染之前。为什么是三角形?因为三角形保证是共面的。这为渲染器节省了大量工作,因为它不必担心“线外着色”。这样做的一个缺点是大多数 3D 图形投影技术不支持完美的球体或其他圆形表面。您必须使用近似值和其他技巧来制作圆形曲面(尽管有一些渲染器支持圆形曲面)。下一步是将所有 3D 点转换或投影为屏幕上的 2D 点(如下所示)。
Picture demonstrating projection
从那里开始,您基本上为三角形“着色”,使所有东西看起来都很立体。虽然这非常快,但另一个缺点是你不能真正拥有反射和折射之类的东西。每当您在游戏中看到折射或反射表面时,他们只是在使用技巧使其看起来像反射或折射 Material 。照明和阴影也是如此。
这是使用特殊着色使球体近似看起来平滑的示例。请注意,您仍然可以看到平滑版本周围的直线:
Picture of smooth shading
光线追踪
您还可以使用 ray tracing 渲染多边形.使用这种方法,您基本上可以追踪光线到达相机的路径。这使您可以进行逼真的反射和折射。但是,我不会详细介绍,因为目前在游戏中实际使用它太慢了。它主要用于 3D 动画(如皮克斯制作的动画)。可以非常快速地对具有低质量设置的简单场景进行光线追踪。但是对于复杂、逼真的场景,渲染一帧可能需要几个小时(就像皮克斯电影的情况)。然而,它确实产生了超逼真的图像:
Picture of a ray traced scene
光线转换
Ray casting不要与上述光线追踪混淆。光线转换不会追踪光路。这意味着您只有平坦的表面;不反光。它也不会产生逼真的光。但是,这可以相对较快地完成,因为在大多数情况下,您甚至不需要为每个像素转换一条光线。这是早期游戏(如 Doom 和 Wolfenstein 3D)使用的方法。在早期的游戏中, map 使用光线转换,角色和其他项目使用始终面向相机的 2D Sprite 进行渲染。 Sprite 是从几个不同的角度绘制的,使它们看起来是 3D 的。这是德军总部 3D 的图像:
Picture of Wolfenstein3D (Javascript clone)
使用 JavaScript 和 HTML5 Canvas 的德军总部:图片来自 Martin Kliehm
存储数据
可以使用多种方法存储 3D 数据。它不一定取决于所使用的渲染方法。存储的数据本身没有任何意义,因此您必须使用已经提到的方法之一呈现它。
多边形
这类似于 SVG。它也是存储模型数据最常用的方法。您可以使用 3D 点定义几何。这些点可以具有其他属性,例如纹理数据(以 UV 映射的形式)、颜色数据以及您可能需要的任何其他属性。
可以使用多种文件格式存储数据。常用的文件格式是 COLLADA ,这是一个存储 3D 数据的 XML 文件。虽然还有很多其他格式。然而,从根本上说,所有文件格式仍在存储 3D 数据。
以下是多边形模型的示例:
Picture of a polygon model
体素
这个方法非常简单。你可以想到voxel models就像位图,除了它们是一堆位图层叠在一起以制作 3D 位图。所以你有一个 3D 像素网格。渲染体素的一种方法是将体素点转换为 3D 立方体。但是请注意,体素不必渲染为立方体。像像素一样,它们只是可能具有可以以不同方式解释的颜色数据的点。我不会详细介绍,因为这不太常见,并且您通常使用多边形方法渲染体素(例如将它们渲染为立方体时。这是体素模型的示例:
Voxel data
图片来自维基百科用户 Vossman

关于game-engine - 3D 游戏如何在没有每个角度的 Sprite 的情况下渲染对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33880396/

相关文章:

java - jMonkeyEngine OBJ 文件没有按预期出现

c++ - 实体组件系统 - 渲染方法

检查游戏板上所有可能线路的算法复杂性

java - 从 AndEngine 切换到 libgdx - 需要了解什么?

3d-modelling - 如何在 Fusion 360 中的组件之间移动草图和实体

blender - 3DS max 或 blender 中的骨骼

javascript - 寻找引擎来开发 2d 或 3d 等轴测图的 html5 游戏?

HTML5 和 Canvas 滚动 : trick interesting or useless?

opencv - 来自多个 View 的运动的结构

graphics - 确定面法线的方向是否一致?