博客地址:blog.liujunliang.com.cn

本文使用C# Winform开发工具运用3D数学基础实现三维渲染

主要有三个步骤:顶点的变换、矩阵的变换、模拟光照三维渲染

本文源码地址:下载链接

顶点的变换

首先实现在一个窗口绘制一个三角形,让其各个顶点自动旋转

让其自动旋转需要使用到旋转矩阵

矩阵公式:

矩阵与顶点的变换代码如下
// 单个顶点的矩阵转换public Vertex4 Mul(Vertex4 vertex){Vertex4 vertex4 = new Vertex4();if (this.mColumn == vertex.Width()){vertex4.mVertexX = this[0, 0] * vertex.mVertexX + this[1, 0] * vertex.mVertexY + this[2, 0] * vertex.mVertexZ + this[3, 0] * vertex.mVertexW;vertex4.mVertexY = this[0, 1] * vertex.mVertexX + this[1, 1] * vertex.mVertexY + this[2, 1] * vertex.mVertexZ + this[3, 1] * vertex.mVertexW;vertex4.mVertexZ = this[0, 2] * vertex.mVertexX + this[1, 2] * vertex.mVertexY + this[2, 2] * vertex.mVertexZ + this[3, 2] * vertex.mVertexW;vertex4.mVertexW = this[0, 3] * vertex.mVertexX + this[1, 3] * vertex.mVertexY + this[2, 3] * vertex.mVertexZ + this[3, 3] * vertex.mVertexW;return vertex4;}else{Console.WriteLine("顶点转化失败!");return null;}           }

使用Winform工具绘制出来

//画出形状(根据点描出线条)public override void Draw(Graphics graphics){graphics.DrawLines(new Pen(Color.Black, 2f), this.GetAllPointF().ToArray());}

其中GetAllPointF函数是获取顶点的X、Y坐标作为在屏幕的显示坐标

//获取各个点屏幕点public List<PointF> GetAllPointF(){List<PointF> pointFList = new List<PointF>();pointFList.Add(GetPointF(this.mCurrentVertexA));pointFList.Add(GetPointF(this.mCurrentVertexB));pointFList.Add(GetPointF(this.mCurrentVertexC));pointFList.Add(pointFList[0]);            return pointFList;}

最终的效果图如下所示

矩阵的变换

以上效果图显示发现,三角形的显示只是在平面上效果,并没有在3D图像上的透视效果

这时我们将三角形进行空间坐标系->世界坐标系->观察坐标系->投影坐标系中的转变

使用的矩阵是mvp矩阵,也就是说将矩阵转换下

 Matrix4X4 m = rotateMatrix.Mul(scaleMatrix);Matrix4X4 mv = m.Mul(viewMatrix);Matrix4X4 mvp = mv.Mul(projectionMatrix);mShape.Transform(mvp);

两个矩阵的转换公式代码如下

// 矩阵的转换public Matrix4X4 Mul(Matrix4X4 matrix){Matrix4X4 matrix4x4 = new Matrix4X4();if (this.mColumn == matrix.mRow){for (int x = 0; x < this.mRow; x++){for (int y = 0; y < matrix.mColumn; y++){for (int z = 0; z < this.mColumn; z++){matrix4x4[x, y] += this[x,z] * matrix[z,y];}}}return matrix4x4;}else{Console.WriteLine("矩阵转化失败!");return null;}}

透视效果图如下

模拟光照三维渲染

在计算光照渲染需要知道3D数学知识

博主归纳了两个

向量:u=(u1,u2,u3) v=(v1,v2,v3) 
叉积公式:u x v = (u2v3-v2u3 ,u3v1-v3u1 ,u1v2-u2v1 )
点积公式:u · v = u1v1+u2v2+u3v33=lul*lvl*COS(U,V)

获取光照角度代码如下

//得到三角形的法线public override Vertex.Vertex4 GetNormal(){//左手法则Vertex.Vertex4 U = this.mCurrentVertexB - this.mCurrentVertexA;Vertex.Vertex4 V = this.mCurrentVertexC - this.mCurrentVertexA;this.mNormal = U.Cross(V);return this.mNormal;}//得到灯光角度public override float GetLightDot(Vertex.Vertex4 lightingDir){float dot = GetNormal().Normalized.Dot(lightingDir.Normalized);return Math.Max(0,dot);}

将三角形填充并且计算光照后的颜色

//画出形状(根据点描出线条)public override void Draw(Graphics graphics){graphics.DrawLines(new Pen(Color.Black, 2f), this.GetAllPointF().ToArray());System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();path.AddLines(this.GetAllPointF().ToArray());int dot = (int)(255 * GetLightDot(new Vertex.Vertex4(0, 0, 250, 1)));Color color = Color.FromArgb(dot,dot,dot);Brush redBrush = new SolidBrush(color);graphics.FillPath(redBrush, path);}

效果显示如下图

博客地址:blog.liujunliang.com.cn

3D数学基础与三维渲染相关推荐

  1. OSG三维渲染引擎编程学习之十七:“第二章:OSG数学基础” 之 “2.7 世界坐标系、物体坐标系、摄像机坐标系”

    第二章 OSG数学基础 OSG是一个优秀的三维渲染引擎,三维渲染涉及到大量的3D数学知识.3D数学是一门和计算机几何相关的科学,研究怎样用数值的方法来解决几何问题,因此,掌握并灵活运用3D数字知识是O ...

  2. C4D和Redshift:2D矢量到三维渲染 Cinema 4D and Redshift: 2D vector to 3D render

    C4D和Redshift:2D矢量到三维渲染 时长:1h 4m |视频:. MP4 1280×720,30 fps(r) |音频:AAC,48000 Hz,2ch |大小解压后:633 MB 含课程文 ...

  3. 3dsMax插件V-Ray建筑可视化三维渲染细节技术学习教程

    通过学习可用于相机放置.建模.修整等的策略,生成令人印象深刻且逼真的建筑三维渲染.了解如何将您的3D渲染场景提升到一个新的水平,以使您的图像引人入胜.有趣且讨人喜欢.在本课程中,讲师Verena Ta ...

  4. 3d数学基础学习总结

    3d数学基础目录 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2章 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 ...

  5. 谈谈GIS三维渲染引擎

    minemap:是我们公司的产品,主要以earth的形态展示,支持矢量切片+倾斜数据(这一点我个人认为是它最大的优点,即兼容了矢量切片精美地图又兼容倾斜数据,目前倾斜数据采用的3dtile格式),目前 ...

  6. 【TouchDesigner】三维渲染

    Cmera COMP Uniform Scale(按比例缩放):沿x,y,z三个轴等比例缩放相机(通常不建议改变相机大小). Constrain To(约束到):让相机附属到某个指定元件上,跟随指定元 ...

  7. GIS三维渲染引擎 到底有什么区别

    minemap:主要以earth的形态展示,支持矢量切片+倾斜数据(这一点我个人认为是它最大的优点,即兼容了矢量切片精美地图又兼容倾斜数据,目前倾斜数据采用的3dtile格式),目前正在重构引擎架构, ...

  8. 3D数学基础及坐标系统

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. 3D数学基础——矩阵、欧拉角和四元数的相互转换与比较

    矩阵.欧拉角和四元数的相互转换与比较 相互转换 这里只展示最终的转换结果,推导过程请参考<3D数学基础:图形与游戏开发> 欧拉角转换到矩阵 欧拉角描述了一个旋转序列,分别计算出给每个旋转的 ...

  10. [Unity3D学习]3D数学基础之向量

    [Unity3D学习]3D数学基础之向量 2014.05.11 向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础. 一.向量 1.向量的数学定义 向量就是一个数字列表,对于程序员来说一个向量 ...

最新文章

  1. js 定时器(setTimeout/setInterval)出现变量未定义(xxx is not defined) 的解决方法
  2. 基础005_V7-Select IO
  3. 产品经理如何开始数据分析之路?(基础知识)
  4. 设置storage模块的数据库操作支持、添加仓储分类列表接口(dao层)
  5. Spring-BeanFactory源码分析
  6. mysql 事实表 维度表_数据库的事实表与维度表
  7. workerman php访问,workerman 配置域名访问 (本地)
  8. vCenter Converter Standalone使用文档
  9. 阿里云助力1药网开辟疫情防控“第二战场”
  10. jsp页面获取系统的日期时间
  11. python 2.7和3.6区别_Windows Python 2.7 和 Python 3.6 共存方法
  12. 大数据分析中的四大数据类型
  13. App 版本更新 versionUpdate
  14. 关于网页消息提示音问题解决与实现
  15. 盘点那些被AI换脸、一键“脱”衣所滥用的AI模型
  16. BZOJ---4484:[Jsoi2015]最小表示【bitset】
  17. 五行代码实现MD5加密(超级简单,一看就会)
  18. cds云服务器_云探CDS拨测服务全面上线
  19. 数据如何变成知识,第 3 部分 提取暗数据
  20. 1.html5+css3基础学习笔记(上)

热门文章

  1. Citrix 桌面云 XenApp_XenDesktop_7.15 部署系列(五)许可证配置
  2. html4音频插件,js音频插件audio.js
  3. JAVASCRIPT视频教程推荐==李炎恢JavaScript教程 第一季
  4. 网络蜘蛛Spider的逻辑Logic(一)
  5. 香港科技大学工学院理学硕士环境工程学及管理(MSc EVEM)2022Fall宣讲会(线上)
  6. shader 如何声明数组_聊聊如何正确向Compute Shader传递数组
  7. JavaScript学习指南 (来自转载)
  8. 前端纯css 图片的模糊处理
  9. PRML - Chapter 01: Introduction
  10. PRML Chapter01 练习题Exercise