mini3d源码解析及功能扩展

网络游戏同步技术一:分类及差异 网络游戏同步的几种方式分类:帧同步、状态同步、快照同步 阅读详情

简介

mini3d是前网易员工@韦易笑开发的3d软渲染引擎,总代码量不到1000行,短小精悍,适合初学者学习。

本文结合源码给出自己的理解,并在原作基础上实现功能扩展:

  1. 补充缺少的三维变换功能(平移、缩放)
  2. 增加简单光照(漫反射)

代码简析

这个项目实现了一个方块的3d渲染,主要功能点有:

  1. 支持平移和旋转
  2. 支持三种不同状态的显示(线框、颜色、纹理)
    在这里插入图片描述

下面来对代码做个简析,主要是把握脉络,不求深入细节。

先看主函数,第一行定义了类型为device_t的变量device。
结构体device_t包含渲染方块用到的所有参数和数据结构:

typedef struct {
	transform_t transform;      // 坐标变换器
	int width;                  // 窗口宽度
	int height;                 // 窗口高度
	IUINT32 **framebuffer;      // 像素缓存:framebuffer[y] 代表第 y行
	float **zbuffer;            // 深度缓存:zbuffer[y] 为第 y行指针
	IUINT32 **texture;          // 纹理:同样是每行索引
	int tex_width;              // 纹理宽度
	int tex_height;             // 纹理高度
	float max_u;                // 纹理最大宽度:tex_width - 1
	float max_v;                // 纹理最大高度:tex_height - 1
	int render_state;           // 渲染状态
	IUINT32 background;         // 背景颜色
	IUINT32 foreground;         // 线框颜色
}	device_t;

其后完成一系列初始化:

函数作用
screen_init初始化屏幕(windows上显示窗口所必需)
device_init初始化设备(为device_t中的成员变量赋初值)
camera_at_zero初始化相机位置,建立相机坐标系
init_texture初始化纹理(蓝白相间图案,存在device_t的texture变量中)

随后进入主循环,每次循环会依次做如下操作:

  • device_clear:清空framebuffer和z-buffer。
  • camera_at_zero:重设相机位置。
  • 监听键盘事件,修改旋转角度alpha和相机x坐标的值,以及切换render_state。
  • draw_box:画方块,具体来说是从方块 -> 平面 -> 三角形 -> 线段 -> 像素,一层层深入;当然这个过程中还包括三维观察坐标变换,以及按z-buffer处理遮挡。最后在framebuffer中为每个像素点设置颜色。
  • screen_update:调用windows api将framebuffer中的像素显示到屏幕上。

功能扩展

以上只是概述。话说要深入理解一段代码,最好的办法还是动手改点东西。

我们来看看有哪些新feature是可以添加进去的。

  • 原作只支持旋转和前后平移(其实是相机的平移,而非方块),我们很容易想到可以完善三维变换的所有功能:平移(包括六个方向)、旋转、缩放。
  • 现在的方块无论从哪个角度看都一个样,原因是缺乏光照。我们可以添加简单的光照,如漫反射和镜面反射。

完善三维变换功能

添加三维变换的关键是:在三维观察坐标变换的流水线中,找到合适的地方对顶点做三维变换。

我们先处理缩放和旋转,通过改写draw_box:

    void draw_box(device_t *device, float alpha, float scale) {
    	matrix_t m1;
    	matrix_set_scale(&m1, scale, scale, scale);
    	matrix_t m2;
    	matrix_set_rotate(&m2, -1, -0.5, 1, alpha);
    	matrix_t m;
    	matrix_mul(&m, &m1, &m2);
    	device->transform.world = m;

再在transform_apply中处理平移, 插入点是在完成相机坐标系的变换之后:

void transform_apply(const transform_t *ts, vector_t *y, const vector_t *x, vector_t *_3d_transform) {
	vector_t t1;
	vector_t t2;
	vector_t t3;
	matrix_apply(&t1, x, &ts->world);
	matrix_apply(&t2, &t1, &ts->view);
	vector_add(&t3, &t2, _3d_transform);
	matrix_apply(y, &t3, &ts->projection);
}

增加简单光照

这里实现的是简单的漫反射。

根据漫反射的实现原理,物体上的顶点在光照下的颜色取决于以下因素:

  • 材质颜色
  • 光的颜色
  • 光的入射方向
  • 顶点所在平面的法向量

按照这些因素一个个来实现。

先定义光源:

// 平行光源
typedef struct {
	color_t color;				// 颜色
	vector_t direction;			// 方向
} light_t;

再根据平面上三点计算法向量:

// 计算平面法向量
void calc_plane_normal(const transform_t *ts, vector_t *normal, const vector_t *x, const vector_t *y, const vector_t *z) {
	vector_t wx;
	vector_t wy;
	vector_t wz;
	vector_t xy;
	vector_t yz;
	matrix_apply(&wx, x, &ts->world);
	matrix_apply(&wy, y, &ts->world);
	matrix_apply(&wz, z, &ts->world);
	vector_sub(&xy, &wy, &wx);
	vector_sub(&yz, &wz, &wy);
	vector_crossproduct(normal, &xy, &yz);
	vector_normalize(normal);
}

然后将法向量传入device_draw_scanline,插入下面一段代码,真正实现光照对颜色的影响:

// 处理光照
float dot = vector_dotproduct(&device->light.direction, normal);
if (dot < 0)
	dot = -dot;
b *= dot * device->light.color.b;
g *= dot * device->light.color.g;
r *= dot * device->light.color.r;

最后实现的效果如图(迎着摄像机的一面因光线影响较亮):
在这里插入图片描述

代码提交到github了,可供参考。

小结

阅读mini3d代码所需基础要求:

  • 理解三维观察坐标变换流水线
  • 理解z-buffer的用法
  • 理解三维变换(平移、旋转、缩放)
  • 了解windows编程

不清楚的部分需要查询计算机图形学书籍或相关资料。

实现这么个软渲染,最大意义在于理论联系实际,将理论知识真正落地。麻雀虽小,五脏俱全。以后还可以继续扩展更多的功能。

MMDetection3D中BEVFormer深度解析:架构、配置与可调试实现 BEV(鸟瞰图)感知是视觉驱动的自动驾驶3D检测核心范式,其本质是将多视角图像特征通过空间-时间建模映射到统一的几何一致BEV特征空间。BEVFormer作为该领域的奠基性工作,首次以可学习的Deformable Attention机制替代硬编码几何投影,实现了鲁棒的视图变换与跨帧时序融合。在MMDetection3D框架下,它被模块化封装为BEVFormerHead,与ResNet主干、FPN颈部解耦协同,支持灵活替换与端到端调试。本文聚焦mmdetection3d中 bevformer的实际集成逻辑,详 阅读详情

相关推荐

min3D文档的地址

min3D地址

笔记--学习mini3d代码

学习韦易笑大神的mini3d代码笔记;

黑山老妖的博客 1715

Cesium中实现GPU计算的泥石流地形侵蚀

通过模拟分析,可以提前识别可能发生泥石流的区域,为防灾减灾提供依据,及时发布预警,避免或减少人员伤亡和财产损失。:在建设公路、桥梁、水库等基础设施时,通过泥石流模拟分析,可以预测泥石流可能对这些设施的影响,帮助工程设计者采取合适的防护措施,确保设施的安全性。:模拟分析有助于为灾后救援工作提供科学依据,确定受灾区域的范围、救援难度等,为救援队伍制定合理的行动方案,提升救援效率。:泥石流是山区常见的地质灾害之一,通过模拟分析可以评估某一地区发生泥石流的风险,指导土地使用规划、人口迁移等决策。

weixin_43481439的博客 1320

mini3d源码解析——数学库篇

gayhub地址在这里 mini3d是实时渲染的hello world级别的demo,是一个小小的使用cpu的渲染引擎 数学库部分 矢量部分 这一部分没有什么好说的,就是向量的一些基本操作, //使用齐次坐标系表示三维空间向量,所以多个w,w为1表示是向量,w为0表示坐标 typedef struct { float x, y, z, w; } vector_t; typedef v...

游戏开发、游戏引擎开发、逆向破解爱好者 1355

数据分析:美团大赛的具体案例制作

在数据集中,存在三个变量的经纬度数据,分别是商家的经纬度数据('sender_lng', 'sender_lat'),顾客的经纬度数据('recipient_lng', 'recipient_lat')和骑手的经纬度数据('grab_lng', 'grab_lat')。根据结果可知,平台订单创建时间的中位数为2022-10-21 02:59:01,平台订单创建时间的众数为2022-10-19 03:29:41、2022-10-23 03:29:47,与直方图相符。接下来,我们对是否为预定订单变量进行分析。

m0_68269346的博客 2497

FPGA实战 —— 基于UART的多设备串口通信系统设计

本文深入探讨了基于FPGA的多设备UART串口通信系统设计。针对工业控制与物联网应用中一对多通信的需求,文章对比了共享总线式、多路独立式等硬件连接方案,并详细阐述了可配置UART IP核、波特率自适应算法以及多路数据仲裁与分发逻辑等核心设计要点。最后,通过一个四传感器采集节点的实战案例,展示了从硬件连接到Verilog代码实现的完整系统构建过程。

weixin_29172963的博客 234

mini3d 项目教程

mini3d 项目教程 1. 项目介绍 mini3d 是一个精简的 3D 软件渲染器,代码量仅为 700 行。该项目旨在通过一个简单的实现,向开发者展示如何编写一个固定管线的软件渲染器。mini3d 没有任何性能优化,主要用于教学目的,帮助开发者理解 3D 渲染的基本原理。 项目的主要特性包括: 单个文件实现所有内容,易于阅读。 独立编译,没有任何第三方库依赖。 支持标准 D3D 坐标模型,使用...

gitblog_01016的博客 883

Linux运维踩坑实录:手把手教你修复LVM中PV显示[unknown]的诡异问题

本文详细解析了Linux运维中LVM物理卷(PV)显示[unknown]的故障现象及修复方法。通过分析问题根源、提供标准修复流程和特殊场景处理方案,帮助运维人员快速解决VG容量异常、PV状态丢失等问题,并分享预防措施与最佳实践,确保LVM存储系统的稳定运行。

weixin_26869081的博客 348

Mini3D:700行代码实现的3D软件渲染器教程

Mini3D:700行代码实现的3D软件渲染器教程 1. 项目目录结构及介绍 Mini3D 是一个简洁的3D软件渲染器项目,其目录结构紧凑且直截了当。以下是关键的目录和文件介绍: . ├── images # 可能存放着项目相关的示例图片或图标 ├── gitignore # 忽略列表文件,定义了哪些文件不应被Git跟踪 ├── LICENSE ...

gitblog_00137的博客 614

2023年美高赛HiMCM:A题蒲公英 思路

蒲公英,通常称为蒲公英,是一种原产于欧亚大陆的植物,现在在世界各地都可以找到[1]。这种植物很容易通过其亮黄色的花朵(图1)和独特的“马勃”种子头(图2)来识别。该头部的每颗种子都附着在一个类似降落伞的结构上,称为“冠毛”,有利于风的传播[2]。如果处于“马勃”阶段的单个蒲公英毗邻一块开阔的一公顷土地,请创建一个数学模型来预测蒲公英在 1、2、3、6 和 12个月内的传播情况。确保您的模型考虑了各种气候条件(例如温带、干旱和热带气候)对蒲公英生长的影响。2. 蒲 公英、人类和其他植物之间的关系很复杂。

斌擎科技 7403

STM32CubeMX之定时器输入捕获

上一章介绍了STM32定时器的PWM输出功能,定时器的几个通道除了有输出功能外,还可以做输入用,可捕获信号的上升沿或下降沿,可以用于测量信号的频率、周期、占空比等。本篇文章将介绍用STM3...

zhang062061的专栏 1341

如何快速上手mini3d:从编译到第一个3D立方体渲染

mini3d是一个仅用700行代码实现的3D软件渲染器,它无需依赖任何第三方库,通过单个文件mini3d.c即可实现完整的固定管线渲染功能。本教程将帮助你快速从编译到成功渲染第一个3D立方体,体验软件渲染的魅力。 ## 准备工作:获取项目源码 首先需要将mini3d项目克隆到本地,打开终端执行以下命令: ```bash git clone https://gitcode.com/gh_mir

gitblog_00027的博客 1033

Esp32蓝牙Hid调用方案 http执行设备、鼠标、键盘相关操作

本文主要介绍 Esp32 蓝牙 Hid 相关的多种操作方式,详细的设备、鼠标、键盘相关操作的 http 调用方法。下面是整理出的所有 http 调用方法和 rhino 引擎方式。本机调用的话直接使用http://localhost:8080 如果是局域网调用则使用软件里的地址 比如我的是http://192.168.1.5:8080。文件地址: https://www.123865.com/s/Qtm4jv-xyZbd?使用前需要一块烧录好的ESP32板子并在手机安装好embedded软件用于蓝牙通信。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 569

rust-analyzer 的 smol_str 演进全解:从 0.2.2 到 0.3.6 的小字符串优化实践与源码剖析

本篇技术指南以 [lib/smol_str/CHANGELOG.md](https://link.gitcode.com/i/621df6ab974c3ef32d80ef8aa21ce26a) 为骨架,完整梳理 `smol_str` 从 0.2.2 到 0.3.6 的版本演进脉络,并结合 [lib/smol_str](https://link.gitcode.com/i/ab7f092a10179

gitblog_01005的博客 888

ardupilot BMI088加速度陀螺仪学习

本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出

陌城烟雨 2056

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

eslint-plugin-reactotron 实战指南:用 `no-tron-in-production` 规则杜绝调试代码进入生产环境

在 React JS 与 React Native 项目中使用 Reactotron 调试时,开发者通常会通过 `console.tron` 在桌面端实时查看日志、网络请求、状态快照等信息。但这类调试代码一旦遗漏在生产构建中,不仅会泄露内部信息、带来无意义的性能开销,还会让 `console` 被污染。`eslint-plugin-reactotron` 正是为此而生的 ESLint 插件,它提供

gitblog_00523的博客 1111

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深度解析:Hunyuan3D-2如何重塑3D内容创作工作流

想象一下,将简单的文字描述或一张普通的图片,在几分钟内转化为逼真的3D模型,这不再是科幻电影中的场景。Hunyuan3D-2作为腾讯开源的高分辨率3D资产生成系统,正在彻底改变3D内容创作的范式。这款基于大规模扩散模型的AI 3D生成工具,不仅提供了业界领先的3D建模能力,更通过创新的两阶段架构,让每个人都能轻松创建高质量的3D内容。 ## 🏗️ 架构原理:解码两阶段生成的核心机制 Huny

gitblog_00188的博客 1006

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

DIY Mini CNC计划与说明

DIY Mini CNC计划与说明首先解释一下CNCGrbl官方源码下载地址:https://github.com/simen/grbl主要原理论述A4988芯片简介步进电机计算一个脉冲的运动距离 作者 CN_PEAK_HAO &amp;amp;amp; MH8888 先上一张渲染图 以下内容仅为个人见解,如有错误请谅解。 首先解释一下CNC CNC(Computerized Numerical Conltr...

MH8888的博客 1万+

三步上手AI 3D生成:Hunyuan3D-2本地部署终极指南

你是否曾梦想过,只需简单描述或上传一张图片,就能瞬间创造出精美的3D模型?现在,这个梦想通过**AI 3D生成**技术变成了现实!Hunyuan3D-2作为业界领先的**开源3D建模**解决方案,让你在自己的电脑上就能体验专业级的3D内容创作。想象一下,你不再需要学习复杂的建模软件,只需几个简单的步骤,就能将创意转化为生动的3D资产! ## 🎯 为什么选择Hunyuan3D-2?重新定义3D创

gitblog_00315的博客 398

MKS TinyBee ESP32 3D打印主板深度解析与实践指南

MKS TinyBee是一款基于ESP32-WROOM-32U模块的智能3D打印控制主板,它集成了Wi-Fi连接功能并支持Marlin 2.0固件,为现代3D打印机提供了强大的控制能力和灵活的扩展性。这款主板不仅兼容传统的LCD显示屏,还支持MKS TFT系列串口屏和MKS MINI12864 V3,让3D打印控制变得更加智能便捷。 ## 为什么选择基于ESP32的3D打印主板? 传统3D打印

gitblog_00938的博客 699

专业级AI 3D生成实战:Hunyuan3D-2本地部署与高效应用指南

Hunyuan3D-2是腾讯开源的高分辨率3D资产生成框架,基于大规模扩散模型实现从文本或图像到高质量3D模型的智能转换。该项目为游戏开发、影视制作、工业设计等领域的专业用户提供了本地化部署的AI 3D生成解决方案,支持文本转3D、图像转3D、纹理合成等多种功能,将复杂的3D建模流程简化为智能化的生成过程。 ## 一、技术架构深度解析:双引擎驱动的3D生成系统 Hunyuan3D-2采用了创新

gitblog_00690的博客 626

实战解析:Hunyuan3D-2本地部署与云端方案深度对比,如何选择最适合你的3D生成环境?

你是否曾因3D模型生成工具的部署复杂性而望而却步?面对本地环境配置的各种依赖冲突,或是担心云端服务的高昂成本,不知道该如何选择?Hunyuan3D-2作为腾讯开源的先进3D资产生成系统,提供了从几何生成到纹理合成的完整解决方案,但在实际应用中,环境配置的选择直接影响着你的工作效率和项目成本。 本文将为你提供一份实战手册,通过问题解决式的结构,帮助你理解Hunyuan3D-2在不同环境下的表现差异

gitblog_00822的博客 250

三天点亮一台 Reachy Mini:开源桌面机器人 DIY 搭建指南

周三晚上,我把一段六行的 Python 丢给同事,桌上那台机器人头像是谁说话就歪头看谁。我站在旁边看了很久,六根电机缓缓收拢。这个体验值得写下来。 Reachy Mini 是一台开源桌面机器人:身高约 30 厘米,头部 6 自由度,身体 1 个旋转,外加两根天线用来"做表情"。它和其他开源机器人方案的区别,在我们手上主要体现在两点。一是结构件全是可 3D 打印的一整套,仓库里放好了模型文件,不用

gitblog_00818的博客 236

从零开始:如何用Reachy Mini打造你的第一台开源桌面机器人

想亲手打造一台能听会说、能看会动的智能机器人吗?Reachy Mini正是为你量身定制的开源桌面机器人平台!这个完全开源的机器人项目将复杂的机器人技术变得简单易学,让每个人都能从零开始制作属于自己的智能伙伴。无论你是编程新手还是创客爱好者,Reachy Mini都能为你打开机器人世界的大门。 ## 🎯 为什么选择Reachy Mini作为你的第一个机器人项目? 传统机器人DIY常常面临三大难

gitblog_00557的博客 332

800元打造自平衡机器人Cubli_Mini:颠覆想象的全解析指南

你是否想过用不到800元的成本,亲手打造一个能够实现自平衡的智能机器人?Cubli_Mini项目正是这样一个令人惊艳的开源工程,它基于苏黎世联邦理工学院Cubli的设计理念,通过小型化、低成本化改造,让每个爱好者都能轻松入门机器人领域。这个10x10x10厘米的立方体机器人集成了电机驱动、充放电系统,在满电状态下可以实现长达5小时以上的点平衡续航能力。 ## 🎯 项目亮点与核心价值 **Cu

gitblog_00390的博客 443

高效部署指南:3个步骤快速配置Hunyuan3D-2高分辨率3D资产生成系统

Hunyuan3D-2是腾讯混元团队推出的高分辨率3D资产生成系统,采用基于流扩散变换器的大规模形状生成模型Hunyuan3D-DiT和纹理合成模型Hunyuan3D-Paint,能够从单张图像或多视角图像快速生成高质量的3D模型。该系统在几何细节、条件对齐和纹理质量方面均超越现有开源和闭源模型,为游戏开发、虚拟现实和数字内容创作提供了强大的3D资产生成解决方案。 ## 1. 问题场景引入:传统

gitblog_00014的博客 1089
上一篇: 《Unity Manual》阅读笔记(二):Scripting
下一篇: 《纪念碑谷》美术风格制作
长三月
博客等级 码龄9年 228粉丝 80原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值