3D渲染器原理及Python朴素实现

本文详细描述了一个从零开始构建的3D渲染器,使用Python和numpy处理3D几何,包括正交投影、Z缓冲技术以及基本的定向照明。作者通过实例展示了如何使用Blender的经验和WebGLAPI创建一个功能有限但满足需求的渲染器,用于生成低多边形精灵图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近,我发现自己需要为即将进行的项目提供一些来自不同角度的低多边形 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值