纯软件算法实现 3D 渲染(by 桌子)

这个项目用 EasyX 实现了软件渲染器,模仿了很多 OpenGL 的 API 定义(类似 OpenGL 运行库),然后在 main.cpp 里面写用户自己的模型及贴图代码。在源码中有详尽的说明。

软件运行可以得到如下的效果:

主要实现的功能:

  • 一些简单的数学运算(矩阵相乘,向量叉乘等)
  • 使用扫描线多边形填充算法绘制多边形
  • 线性插值(linear interpolation)
  • 透视校正插值(perspective correct interpolation)
  • 深度测试(用于消隐)

一些我想到的但是暂时没实现的功能:

  • 不支持 ddx 和 ddy,所以没有 Mipmap,因为实现起来比较麻烦。
    ddx 和 ddy 是指在屏幕空间上求 vbo 的偏导数。真正的 GPU 绘制的时候
...

方块阵动画

一个方块阵,旋转移动的动态效果,执行效果如下:

可以在宏定义直接改变数量和画布大小等,直接感受不同的视觉效果。

完整源代码如下:

//项目名称		方块阵
//作者			星羽1704
//email			1479245050@qq.com
//联系方式		qq 1479245050
//描述			一个方块阵,旋转移动的动态效果
//编译环境		win10 64位 + vs2017 + easyx—ver: 20180727(beta)
////////////////////////

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>

////////////宏定义
//	常量
#define PI					3.1415926535898							//	
...

方块旋转动态

这个程序展示了一组旋转立方体构成的动态图像。

完整源代码如下:

// 项目名称		方块旋转动态
// 作者			星羽1704
// email		1479245050@qq.com
// 联系方式		qq 1479245050
// 描述			将三维空间的点投影到二维平面,感受三维正方体的旋转的视觉盛宴
//				暂时做到这点,以后要修改的话,应该是2019年的6月了。
// 编译环境		win10 64位 + vs2017 + easyx—ver: 20180727(beta)
//
#include <graphics.h>
#include <math.h>

#define		Db_x				640
#define		Db_y				640 
#define		center_x			Db_x/2
#define		center_y			Db_y/2
#define		square_root_two		1.
...

【七夕活动精选】致你的七夕礼物——3D Heart(by Nomango)

程序效果很简单,是一颗跳动的心脏,心脏下面有一行小字写着“七夕快乐”,按住鼠标左键并拖动可以让它旋转起来,按住右键可以让这颗心暂时停止跳动。

执行效果如下:

完整的源代码如下:

/////////////////////////////////////////////////////////
// 程序名称:致你的七夕礼物 —— 3D Heart
// 编译环境:Visual Studio 2017,EasyX 20151015(beta)
// 作    者:Nomango <www.nomango.cn>
// 最后修改:2017-8-19
// 项目类型:Win32 Console Application
//

#include <easyx.h>
#define _USE_MATH_DEFINES
#include <math.h>
#incl
...

三维旋转球 源码+注释+简单讲解

关于三维的东西远不止这么点内容,也不是我几句话可以讲完的,需要大家扎扎实实的看图形学。不能好高骛远,要扎实、系统的学习。还要注意相关数学知识的学习。

过去我写了一些简单教程(以后还会写),但是这篇文章不算教程。我写这篇文章,是想表达我前面的看法,希望大家能认识到。

我在这篇文章里尽量不用图形学的术语,也不做优化、不加额外功能,只希望大家能从道理上看的清楚明白。

简单讲一下:
关于一个点,一定要有一个三维坐标,程序中的结构体 POINT3D 就是;
点的初始化由函数 InitPoint() 实现,该函数产生了 n 个半径为 1 的点;
点的运动,是在三维坐标内运动的,包括平移、缩放、旋转等。这个程序只涉及到了旋转,定义了三个方法:RotateX()、RotateY()、RotateZ(),分别实现绕三个轴旋转;
最后需要将三维世界呈现出来,这里用到一个术语:投影,就是将三维的画面投影到二维上。投影有多种方法,这个球体用一点透视就可以。还需要一个“观察点”,程序中用 viewZ

...