3D数学基础与三维渲染
博客地址: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数学基础与三维渲染相关推荐
- OSG三维渲染引擎编程学习之十七:“第二章:OSG数学基础” 之 “2.7 世界坐标系、物体坐标系、摄像机坐标系”
第二章 OSG数学基础 OSG是一个优秀的三维渲染引擎,三维渲染涉及到大量的3D数学知识.3D数学是一门和计算机几何相关的科学,研究怎样用数值的方法来解决几何问题,因此,掌握并灵活运用3D数字知识是O ...
- 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 含课程文 ...
- 3dsMax插件V-Ray建筑可视化三维渲染细节技术学习教程
通过学习可用于相机放置.建模.修整等的策略,生成令人印象深刻且逼真的建筑三维渲染.了解如何将您的3D渲染场景提升到一个新的水平,以使您的图像引人入胜.有趣且讨人喜欢.在本课程中,讲师Verena Ta ...
- 3d数学基础学习总结
3d数学基础目录 第1章 简介 1.1 什么是3D数学 1.2 为什么选择本书 1.3 阅读本书需要的基础知识 1.4 概览 第2章 笛卡尔坐标系统 2.1 1D数学 2.2 2D笛卡尔数学 2.3 ...
- 谈谈GIS三维渲染引擎
minemap:是我们公司的产品,主要以earth的形态展示,支持矢量切片+倾斜数据(这一点我个人认为是它最大的优点,即兼容了矢量切片精美地图又兼容倾斜数据,目前倾斜数据采用的3dtile格式),目前 ...
- 【TouchDesigner】三维渲染
Cmera COMP Uniform Scale(按比例缩放):沿x,y,z三个轴等比例缩放相机(通常不建议改变相机大小). Constrain To(约束到):让相机附属到某个指定元件上,跟随指定元 ...
- GIS三维渲染引擎 到底有什么区别
minemap:主要以earth的形态展示,支持矢量切片+倾斜数据(这一点我个人认为是它最大的优点,即兼容了矢量切片精美地图又兼容倾斜数据,目前倾斜数据采用的3dtile格式),目前正在重构引擎架构, ...
- 3D数学基础及坐标系统
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 3D数学基础——矩阵、欧拉角和四元数的相互转换与比较
矩阵.欧拉角和四元数的相互转换与比较 相互转换 这里只展示最终的转换结果,推导过程请参考<3D数学基础:图形与游戏开发> 欧拉角转换到矩阵 欧拉角描述了一个旋转序列,分别计算出给每个旋转的 ...
- [Unity3D学习]3D数学基础之向量
[Unity3D学习]3D数学基础之向量 2014.05.11 向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础. 一.向量 1.向量的数学定义 向量就是一个数字列表,对于程序员来说一个向量 ...
最新文章
- js 定时器(setTimeout/setInterval)出现变量未定义(xxx is not defined) 的解决方法
- 基础005_V7-Select IO
- 产品经理如何开始数据分析之路?(基础知识)
- 设置storage模块的数据库操作支持、添加仓储分类列表接口(dao层)
- Spring-BeanFactory源码分析
- mysql 事实表 维度表_数据库的事实表与维度表
- workerman php访问,workerman 配置域名访问 (本地)
- vCenter Converter Standalone使用文档
- 阿里云助力1药网开辟疫情防控“第二战场”
- jsp页面获取系统的日期时间
- python 2.7和3.6区别_Windows Python 2.7 和 Python 3.6 共存方法
- 大数据分析中的四大数据类型
- App 版本更新 versionUpdate
- 关于网页消息提示音问题解决与实现
- 盘点那些被AI换脸、一键“脱”衣所滥用的AI模型
- BZOJ---4484:[Jsoi2015]最小表示【bitset】
- 五行代码实现MD5加密(超级简单,一看就会)
- cds云服务器_云探CDS拨测服务全面上线
- 数据如何变成知识,第 3 部分 提取暗数据
- 1.html5+css3基础学习笔记(上)
热门文章
- Citrix 桌面云 XenApp_XenDesktop_7.15 部署系列(五)许可证配置
- html4音频插件,js音频插件audio.js
- JAVASCRIPT视频教程推荐==李炎恢JavaScript教程 第一季
- 网络蜘蛛Spider的逻辑Logic(一)
- 香港科技大学工学院理学硕士环境工程学及管理(MSc EVEM)2022Fall宣讲会(线上)
- shader 如何声明数组_聊聊如何正确向Compute Shader传递数组
- JavaScript学习指南 (来自转载)
- 前端纯css 图片的模糊处理
- PRML - Chapter 01: Introduction
- PRML Chapter01 练习题Exercise