基于x-scan扫描线的3D模型渲染算法

基于x-scan算法实现的z-buffer染色。c#语言,.net core framework 3.1运行。

模型是读取3D Max的obj模型。

x-scan算法实现:

cs 复制代码
public List<Vertex3> xscan() {
	List<Vertex3> results = new List<Vertex3>();

	SurfaceFormula formula = getFormula();
	Box rect = getBound();

	for (int y = rect.IntMinY; y <= rect.IntMaxY; y++) {

		List<double> set = new List<double>();

		for (int i = 0; i < this.vectex.Length; i++) {
			Vertex3 v1 = this.vectex[i];
			Vertex3 v2 = this.vectex[(i + 1) % vectex.Length];

			if (v1.IntY == v2.IntY || y < Math.Min(v1.Y, v2.Y) || y > Math.Max(v1.Y,v2.Y ))
				continue;

			LineFormula formula1 = new LineFormula(v1, v2);
			Double? x = formula1.getX(y);

			if (x != null) {
				bool e = false;
				foreach (double d in set) 
					if (Math.Abs(d - x.Value) < 0.005)
						e = true;
				
				if (e == false)
					set.Add(x.Value);
			}

		}

		if (set.Count > 0 && set.Count % 2 == 0) {
			set.Sort();

			for (int i=0; i<set.Count-1; i++)
				for (int x = (int)set[i]; x <= (int) set[i + 1]; x++)
					results.Add(new Vertex3(x, y, formula.getZ(x, y)));
			
		}
	}

	return results;
}

z-buffer算法:

cs 复制代码
private List<Vertex3RGB> zbuffer(Model.Model model, Bitmap canvas) {
	int?[,] deep = new int?[canvas.Width, canvas.Height];
	Vertex3RGB[,] pixels = new Vertex3RGB[canvas.Width, canvas.Height];

	for (int i = 0; i < canvas.Width; i++)
		for (int j = 0; j < canvas.Height; j++)
			deep[i, j] = null;


	foreach (Surface surface in model.Surface)
	{
		Vertex3 nv = surface.NormalVector();
		if (this.normalvector && nv.Z <= 0)
			continue;

		List<Vertex3> results = surface.xscan();

		foreach (Vertex3 v in results)
		{

			if (v.IntX < 0 || v.IntX >= canvas.Width)
				continue;
			if (v.IntY < 0 || v.IntY >= canvas.Height)
				continue;

			if (deep[v.IntX, v.IntY] == null || v.IntZ > deep[v.IntX, v.IntY])
			{
				deep[v.IntX, v.IntY] = v.IntZ;
				pixels[v.IntX, v.IntY] = new Vertex3RGB(v, brushColor.ToArgb(), nv);
			}
		}
	}


	List<Vertex3RGB> r = new List<Vertex3RGB>();
	for (int i = 0; i < pixels.GetLength(0); i++)
		for (int j = 0; j < pixels.GetLength(1); j++)
			if (pixels[i, j] != null)
				r.Add(pixels[i, j]);

	return r;
}

原始模型如下(使用法相量):

基于x-scan的zbuffer算法(使用法向量):

基于x-scan光照渲染(使用法向量):

相关推荐
weixin_468466851 分钟前
通义千问核心能力与实战表现深度评测
人工智能·深度学习·算法·ai·大模型
菜菜的顾清寒5 分钟前
力扣HOT100(48)图论-腐烂的橘子
算法·leetcode·图论
Ulyanov13 分钟前
深入QML滑块与进度控制:构建动态数据可视化界面:QML+PySide6现代开发入门(六)
开发语言·python·算法·ui·信息可视化·雷达电子对抗仿真
星马梦缘13 分钟前
ACM笔记 学习版本
数据结构·c++·算法
CQU_JIAKE15 分钟前
6.1【A】
算法
wayz1118 分钟前
Momentum:CTI(相关趋势指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
fengxin_rou19 分钟前
【滑动窗口与前缀和算法实战】:LeetCode560.438 高频题深度解析
java·算法·leetcode
Dillon Dong22 分钟前
【风电控制】FPGA vs DSP 在ADC采样中的选择——从架构差异到工程实践
算法·变流器·风电控制·dfig
科研小白_22 分钟前
【第九期:MATLAB点云处理基础】基于 Alpha Shapes 的边缘点提取
算法
sali-tec26 分钟前
C# 基于OpenCv的视觉工作流-章80-长短脚
图像处理·人工智能·opencv·算法·计算机视觉