#WPF的3D开发技术基础梳理

简介: 原文:#WPF的3D开发技术基础梳理 自学WPF已经有半年有余了,一遍用,一边学。但是一直没有去触摸WPF的3D开发相关技术,因为总觉得在内心是一座大山,觉得自己没有能力去逾越。
原文: #WPF的3D开发技术基础梳理

自学WPF已经有半年有余了,一遍用,一边学。但是一直没有去触摸WPF的3D开发相关技术,因为总觉得在内心是一座大山,觉得自己没有能力去逾越。最近因为一个项目的相关原因,需要用的3D技术,虽然内心没有底只能硬着头皮上了。最后效果还不错。
开发完之后,对WPF的开发小有所感,于是打算写下来,把相关知识梳理下。给正在学习WPF技术伙伴们一点帮助。
能力平平,知识有限,如有错误,还望雅正。

   作为微软推广的一门软件开发技术,肯定会遵循一个基本准则:怎么方便怎么来,怎么舒服怎么来。说的有点带色彩,但理没错。我们在学习这些知识的时候,我们可以先换一个角度来思考这样一个问题:假如微软砸一亿(YY一下),让你去开发一门技术,用来做出各种各样超炫的3D场景,你会大致怎么下手:
   我不知道你具体会怎么办,但是一想到3D里面各种各样的形状,颜色等等....我们肯定也都会在内心想,要设计出这么技术,肯定要把这么元素分开来搞。没错,微软的那帮专家们也是这么想的,大家英雄所见略同呀,哈哈。
   下面就一一来介绍这些需要分开的元素了

1. 类 Viewport3D

首先需要介绍的就是Viewport3D类。Viewport3D官方解释是呈现 Viewport3D 元素的二维布局范围内包含的三维内容。说的有些拗口,说白了就是首先你展现你的3D,你就必须有一个可以放你3D内容的盒子,存放你3D元素。本质和那些grid什么的控件一样。

这是csdn 的专业解释:https://msdn.microsoft.com/zh-cn/library/system.windows.controls.viewport3d.aspx
属性太多,就不一一解释了,但是有2个元素要重点说名下。
假设一下,viewport是一个箱子,全密封的。里面黑不溜秋,啥也看不见。但是里面放了一些东西:比如说一把椅子。你要通过画面感的东西,告诉别人里面有什么东西,而不是文字性的东西。
你就会想:这个箱子里面那么黑,至少需要有一盏等吧,才能看的清。没错,微软的专家们也是这么想的,于是他们就给Viewport里面加一个Children————Light。

1.1 Light

但现实中Light也分好几种呀,有一束光的形式的、也有手术台上的那种无影灯,还有其它各种各样的。
在WPF里面,也有好几种灯:AmbientLight、DirectionalLight、PointLight和SpotLight。   
    1、AmbientLight是不自然的光,会近似照亮整个场景。使用这种光看不到边界。
    2、DirectionalLight定义了定向光。太阳光就是一种定向光,光线来自一边,此时可以看到边界和阴影。
    3、PointLight是一种位于指定位置的光,会照亮所有的方向。
    4、SpotLight照亮指定的方向。这个光定义了一个圆锥的形象,会得到一个发出光亮的区域。
具体实际开发过程中需要哪种灯光效果去看清箱子里面的东西,大家就自己选了。

1.2 Camera

说到这,现在箱子里面有了光,但是不行呀,因为箱子密不透风,还是从外面看不出来你里面有什么了。要是能在箱子上凿一个洞,不仅能借到光,也能看清楚箱子里面有什么了。
凿洞是个解决方法,但不是个好办法,整点高科技的:Camera(摄像机);箱子上面装了个摄像机。
Camera有了、但是问题又来了:这摄像机怎么摆呢?这朝天看呢,还是朝地上。
要解决这个问题,就要用到Position(位置)、LookDirection(位置方向)、UpDirection(摄像机上面的方面)、FieldOfView(镜头角度)、NearPlaneDistance(近端距离)、FarPlaneDistance(远端距离)。
1、Position:顾名思义就是一个空间的点(Point3D),来表示摄像机的位置。
2、LookDirection:就是摄像机镜头朝看的方向(Vector3D)。
3、UpDirection:就是摄像机上面的方向(Vector3D)。
4、FieldOfView:这个摄像机是一个单反,可以自动变焦的。而FileofView 就是摄像机调节焦距的参数。可以通过调节这个参数,来拉近或者放远这些参数。
5、NearPlaneDistance:近端距离 
6、FarPlaneDistance:远端距离

摄像机基本这样愉快的设定好了。

2 类ModelVisual3D

箱子灯也有了,摄像机也有了,现在就差主角————箱子里面的宝贝了,首先上场的就是ModelVisual3D。
ModelVisual3D,顾名思义,就是看到的3D模型。
构建一个3D模型,很显然,首先要明确这个模型的现状,然后再明确这个形状的材质,也就是画刷。

2.1 GeometryModel3D

GeometryModel3D类就是定义模型的几何形状的类。首先要明确一个概念:就是任何几何形状都可以用一定数量三角形来构成。比如说一个正方形就是2个三角形构成的。 就是按照这个思路完成的。
GeometryModel3D主要有geometry(几何形状)、和Material(材质)设定。
GeometryModel3D的geometry是MessGeometry3D(纹理几何3D),(不要问我为什么,我暂时也不知道,待我仔细需找找资料)
**MessGeometry3D是这一里的重点了**。
MessGeometry3D有4个且有关键的属性:Position(几何内顶点的集合)、Normals(法向量集合)、TextureCoordinates(纹理坐标集合)、TrianglenIndices(三角形索引集合)。
1、Position:先说说这个顶点。
在wpf里面,有一个xyz的三维坐标。如下图所示:
![三维坐标](https://img-blog.csdn.net/20150328235600769)
一个几个形状参考这样一个几何图形,构成相应的点(Point3D)的集合。如果一个正方形会有8个点。
P1(1 0 -1)
P2(-1 0 -1)
P3(-1 0 1)
P4(1 0 1)
P5(1 1 -1)
P6(-1 2 -1)
P7(-1 3 1)
P8(1 4 1)
(这些点,大家可以画在一个草稿上)
2、TrianglenIndices:三角索引集合。
有了点的集合,但是如何将这些点构成一个个面呢,而且是构成我们想要的面呢?
只有当构成的面正确了,然后再能构成我们想要的几何形状。
三角形索引就是帮助我们构成面的。
三角形索引就是按照我们点的顺序(从0开始)逆时针(以所需要面为正面)描出来。我们上面说了2个三角形可以构造一个正方形。所以一个长方体需要12个三角形。
023   012  014   154  165  126  276  247  037  074  456  467 

3、TextureCoordinates:纹理坐标用于确定将 Material 映射到构成网格的三角形的顶点的方式。
对于一个面,WPF里面规定
左上角(0 0)           右上角(1 0)
左下角(0 1)           右下角(1 1)

比如这个立方体底部的面  正常的顺序是 P1 P2 P3 P4  
也就是 01 10 11 01  
这个是正常的顺序,

!了的样这是就能可,果效示显那 

4 Normals 法向量集合
学过几何的人都知道立体几何里面有一个法向量,它是与说描述的面成一个垂直的关系。在这里面也是与定义网格的每个三角形的面垂直的向量。 法向量用于确定是否亮显给定三角形面。如果指定了三角形索引,则将考虑相邻面来生成法向量。

Geometry3D的几何纹理说完了,就是Material(材质)了。
这个比较简单
有DiffuseMaterial 扩散材质,可以类比为普通的白石灰墙那种材质
SpecularMaterial 透视材质  可以类比为家里普通的窗户玻璃材质
EmissiveMaterial 放射性材质 额 这个家里貌似都不太有  大家自行脑补吧

各个材质有画刷属性,通过画刷属性,可以为材质图上不同的颜色、甚至是图案画刷等等。

通过完整为以上设置,及调整,基本就可以出来我们想要的3D图形了。可能结构有些乱,我再来一张图表示下:

![这里写图片描述](https://img-blog.csdn.net/20150329005744356)

3 类Viewport2DVisual3D

上面描述的是重新绘制的3D模型作为内容、但是wpf也可以将其它普通控件,如Button、Image、TextBox变成3D立体呈现的效果。这个时候就需要接下来介绍的Viewport2DVisual3D.
与ModelVisual3D系统,也需要设置Geometry属性(既是messgeometry3D),还有Matrail(材质)。
还有个visual属性即我们需要立体呈现的控件元素了。


初稿先写到这,示例代码或者需要修改或者补充的到时再继续完善。
2015年3月29日01:12:57

目录
相关文章
|
4天前
|
SQL 中间件 C#
一个使用 WPF 开发的管理系统
一个使用 WPF 开发的管理系统
|
4天前
|
网络协议 网络安全 C#
基于 WPF 开发的简约,功能强大的终端模拟器
基于 WPF 开发的简约,功能强大的终端模拟器 前言今天大姚给大家推荐一款基于 WPF 开发的简约,功能强大的终端模拟器:ModengTerm。项目介绍ModengTerm是一款基于 WPF 开发的简约,功能强大的终端模拟器,可以用来连接SSH服务器,串口,TCP服务器,Windows命令行等。项目功能支持与SSH服务器,串口,Windows命令行进行交互。可以保存会话信息,方便下次直接登录。支持将终端内容导出为txt和html格式。根据关键字/正则表达式进行历史记录的查找。同步输入功能、历史记录、度可定制化的颜色主题、实时记录日志功能等。项目源码运行设置ModengTerm为启动项目运行:
|
4月前
|
C# 开发者 Windows
WPF 应用程序开发:一分钟入门
本文介绍 Windows Presentation Foundation (WPF),这是一种用于构建高质量、可缩放的 Windows 桌面应用程序的框架,支持 XAML 语言,方便 UI 设计与逻辑分离。文章涵盖 WPF 基础概念、代码示例,并深入探讨常见问题及解决方案,包括数据绑定、控件样式与模板、布局管理等方面,帮助开发者高效掌握 WPF 开发技巧。
179 65
|
5月前
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
|
5月前
|
容器 C# Docker
WPF与容器技术的碰撞:手把手教你Docker化WPF应用,实现跨环境一致性的开发与部署
【8月更文挑战第31天】容器技术简化了软件开发、测试和部署流程,尤其对Windows Presentation Foundation(WPF)应用程序而言,利用Docker能显著提升其可移植性和可维护性。本文通过具体示例代码,详细介绍了如何将WPF应用Docker化的过程,包括创建Dockerfile及构建和运行Docker镜像的步骤。借助容器技术,WPF应用能在任何支持Docker的环境下一致运行,极大地提升了开发效率和部署灵活性。
167 1
|
5月前
|
开发框架 缓存 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
|
5月前
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
125 0
|
5月前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
131 0
|
5月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
94 0
|
5月前
|
区块链 C# 存储
链动未来:WPF与区块链的创新融合——从智能合约到去中心化应用,全方位解析开发安全可靠DApp的最佳路径
【8月更文挑战第31天】本文以问答形式详细介绍了区块链技术的特点及其在Windows Presentation Foundation(WPF)中的集成方法。通过示例代码展示了如何选择合适的区块链平台、创建智能合约,并在WPF应用中与其交互,实现安全可靠的消息存储和检索功能。希望这能为WPF开发者提供区块链技术应用的参考与灵感。
71 0