基于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光照渲染(使用法向量):

相关推荐
じ☆冷颜〃4 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
数据大魔方4 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
POLITE34 小时前
Leetcode 23. 合并 K 个升序链表 (Day 12)
算法·leetcode·链表
楚来客4 小时前
AI基础概念之八:Transformer算法通俗解析
人工智能·算法·transformer
Echo_NGC22375 小时前
【神经视频编解码NVC】传统神经视频编解码完全指南:从零读懂 AI 视频压缩的基石
人工智能·深度学习·算法·机器学习·视频编解码
会员果汁5 小时前
leetcode-动态规划-买卖股票
算法·leetcode·动态规划
橘颂TA5 小时前
【剑斩OFFER】算法的暴力美学——二进制求和
算法·leetcode·哈希算法·散列表·结构与算法
地平线开发者7 小时前
征程 6 | cgroup sample
算法·自动驾驶
姓蔡小朋友7 小时前
算法-滑动窗口
算法