当前位置: 首页 > news >正文

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

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

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

x-scan算法实现:

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算法:

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

http://www.lryc.cn/news/102244.html

相关文章:

  • LeetCode36.Valid-Sudoku<有效的数独>
  • Linux中的pause函数
  • CommonCollections6链分析
  • 优化基于tcp,socket的ftp文件传输程序
  • MySQL 数据库 【增删查改(二)】
  • 力扣 -- 978. 最长湍流子数组
  • 甘特图 Dhtmlx Gantt
  • iOS 应用上架流程详解
  • Python入门【LEGB规则、面向对象简介、面向过程和面向对象思想、面向对象是什么? 对象的进化 、类的定义、对象完整内存结构 】(十三)
  • 【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务
  • 【C语言初阶】指针篇—上
  • 基于FasterRCNN深度学习网络的车辆检测算法matlab仿真
  • 机器学习深度学习——多层感知机
  • Django模型将模型注释同步到数据库
  • STM32 Flash学习(二)
  • kotlin获取泛型集合的类型信息
  • AQS源码解析
  • 关于在VS2017中编译Qt项目遇到的问题
  • Python web实战 | 使用 Flask 实现 Web Socket 聊天室
  • Android10 Recovery系列(一)隐藏recovery菜单项
  • 选好NAS网络储存解决方案,是安全储存的关键
  • AnimateDiff论文解读-基于Stable Diffusion文生图模型生成动画
  • centos7安装tomcat
  • 【C#教程】零基础从入门到精通
  • opencv rtsp 硬件解码
  • 机器学习-Gradient Descent
  • MySql003——SQL(结构化查询语言)基础知识
  • springCloud Eureka注册中心配置详解
  • gti 远程操作
  • Ftrace