最近,我发现自己需要为即将进行的项目提供一些来自不同角度的低多边形 3D 模型的低分辨率精灵。 像这样的东西:
获得它们的可能方法包括:
- 学习一点 Blender
- 在 WebGL 中制作
- 编写我自己的渲染器
我对 Blender 的短暂经历已经让我受到了创伤,而且 WebGL 的 API 有点令人困惑。 还有什么比在我自己的 3D 引擎中进行一些 3D 变换更好的机会来温习线性代数呢?
这是 Github 存储库的链接。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割
1、3D 对象是如何表示的
3D 图形超简短介绍:所有 3D 对象都由 3D 空间中的三角形表示。 这意味着每个三角形由 3 个点组成,每个点包含 3 个变量:x、y 和 z。
我们的目标是将这些点、颜色等的数组转换为漂亮的 .png 图片,我们可以将其用作精灵。
你看到的大多数 3D 图形都是透视投影,因此距离相机较远的物体看起来较小。 但我们只会关注并非如此的正交投影。 无论物体距离相机有多远,它的大小都不会改变。
所以我们将在这里构建的是:
- ✔️ 功能强大的 3D 渲染器,可调节相机方向
- ✔️ Z 缓冲可准确表示重叠三角形
- ✔️基本定向着色
我们不会介绍的内容(至少目前):
- ❌物体投射到其他物体上的阴影
- ❌ 纹理化
- ❌透视投影
而且它也不能在 GPU 上运行。 效率不会很高。 实时渲染复杂的场景(甚至可能是简单的场景)是不够的。 但这会很有趣并且令人满意,至少对我来说是这样。
2、第一张图片
安装依赖项,我们将使用 numpy 进行矩阵运算,并使用 Pillow 将数组转换为图像。
pip install Pillow numpy
在 renderer.py 文件中创建 Object3D 类来存储各个模型。
# renderer.py
import numpy as np
from PIL import Image
class Object3D:
def __init__(self, points, triangles, colors):
self.points = points
self.triangles = triangles
self.colors = colors
points
:包含 3D 对象中点坐标的数组triangles
:包含组成三角形的点索引的数组colors
:每个三角形的 RGB 值数组(例如白色 = [255, 255, 255])
渲染器类:
# renderer.py
class Renderer:
def __init__(
self,
objects,
viewport,
resolution,
camera_angle=0.0,
camera_pitch=0.0,
):
self._objects = objects
self._viewport = viewport
self._resolution = resolution
self._camera_angle = camera_angle
self._camera_pitch = camera_pitch
resolution_x, resolution_y = self._resolution
self._screen = np.ones((resolution_y, resolution_x, 3), "uint8") * 120
x_min, y_m