WPF中的三维空间(1)

原文:WPF中的三维空间(1)

WPF中可以创建三维几何图形,支持3D对象的应用,支持从3D Max等软件将3D文件obj导入设计中,但是目前还不支持将材质同时导入,这样需要在WPF中对3D对象重新设置颜色或贴图。

2.10.1 WPF中的三维空间

1.三维空间坐标

WPF中二维图形的坐标系原点定位在呈现区域(屏幕)的左上角,其X 轴上的正方向朝右,Y轴的正向朝下。 在WPF的三维坐标系中,原点一般位于在WPF中创建的三维对象的中心(导入的三维对象的情况就不一定了,比如从3DMax中导入的obj文件),三维坐标的X 轴正方向朝右,Y轴的正方向朝上,Z轴的正方向从原点向外朝向观察者。

图2-191
三维空间坐标

图2-191给出了WPF三维空间坐标系(X:红色,Y:绿色,Z:蓝色),两个坐标轴之间的弧线表示可以旋转,其中:

Y-Z之间的弧线(红色)表示可以围绕X轴旋转;

X-Z之间的弧线(绿色)表示可以围绕Y轴旋转;

X-Y之间的弧线(蓝色)表示可以围绕Z轴旋转。

2.照相机及典型位置

照相机是观察者观察三维对象形态和位置的工具,照相机的位置坐标及与对象的距离直接影响到三维对象的呈现。WPF中的相机有正交相机(OrthographicCamera)和透视(远景)相机(PerspectiveCamera)两类,从观察者的角度来说前者对观察对象没有透视感,远近都一样。后者的工作原理与普通照相机镜头类似,对象离照相机越远,看起来就越小,观察到的对象则有远小近大的效果。

照相机的位置坐标是可以变化的,一个典型的透视相机位置设置如图2-192所示。

图2-192
典型的透视相机位置设置

图2-192中,当相机位置靠近Z轴中心时,即Z坐标值变小,观察到的对象变大,当相机位置远离Z轴中心时,即Z坐标值变大,观察到的对象变小。

照相机的位置就是观察者的位置,相机的位置可以任意设置,这样观察到的三维对象的“形象”就会发生变化,在三维场景中正确设置相机位置很重要,图2-192是一个典型设置。

3.材料

三维对象使用的材料分三类:

漫射材料:确定三维对象在直射光(白光)照射下的颜色,其作用就如同墙面喷漆一样。

放射材料:使对象产生发光效果。光的颜色由材料的颜色决定。

反射材料:控制三维对象上高光反射区域的颜色。高光反射区域指在金属铬等光滑亮泽表面上看到的光亮区域。

4.光的分类

照射在三维对象上的光线分为4类,如图2-193所示。

图2-193
光的分类

(1)环境光:环境光将光投向各个方向,使所有对象均匀受光。如果只用环境光,则

对象可能会显得褪色,而且颜色单一。为了获得最佳效果,需要使用其他光。如图2-193左一图。

(2)投射光:投射光所投射的光如同聚光灯一般,光从发光位置发出,并在锥形区域内传播。投射光不会影响到位于锥形发光区域以外的那部分三维对象。如图2-193左二图。

(3)定向光:定向光沿着特定的方向均匀平行投射,就像太阳光一样。如图2-193左三图。

(4)点光:点光从一个点向所有方向投射光,就像普通的灯泡一样。如图2-193右图。

2.10.2 WPF三维空间的元素

1.Viewport3D控件

Expression Blend中提供了Viewport3D控件,这是三维对象元素的上层容器,是相机对象元素Camera、三维图形呈现对象元素ModelVisual3D的集合。添加obj对象到【设计面板】后就自动建立了1个Viewport3D控件,在【对象和时间线】面板中可以看到,其中包含下列属性设置:

(1) Camera:相机,可以在【属性】面板选择以下属性设置:

相机类型:远景相机、正交相机及有关参数;

Position:照相机在三维空间中的位置;

Direction:照相机在三维空间中的拍摄方向;

UP Vector:正向矢量,指定此照相机的“上方”所指的方向。

Perspective Field of
View:透视视野,仅适用于远景相机,较小的数值会减少对象因远景拍摄而变形的程度。较大的数值会像使用鱼眼镜头一样导致对象大幅变形。

Near Clipping Plane/Far Clipping Plane:近点/远点剪切平面,可控制对象与照相机之间的最近或最远距离,超出上述距离的对象将从所呈现的视图中消失。

(2)AmbientLight:环境光色彩设置,可以在上述的光类型中选择需要的光源。

(3)DirectionLight:定向光色彩设置,可以在上述的光类型中选择需要的光源。

(4)DefaultMaterial:材质设置,可以在前面介绍的材料类型中选择,可以选择图形刷资源。

2.ModelVisual3D元素

三维元素ModelVisual3D可以再包含多个ModelVisual3D子元素,比如灯光,三维造型。

3.GeometryModel3D元素

GeometryModel3D是ModelVisual3D子元素内的三维造型元素,材质是其属性,而三维图形构建又由最底层网格元素MeshGeometry3D完成。

4.MeshGeometry3D元素

这是1个若干3D点(Point3D)的集合,每3个3D点按一定环绕方向组成1个三角形,WPF采用逆时针的环绕方向,符合所谓“右手法则”,即垂直竖起右手的大拇指,弯曲其余4指,其余4指指向正是三角形的环绕方向,大拇指的指向是三角形的正面,反向是其背面,如图2-194所示,正是这些三角形构成了WPF中的三维造型世界。

图2-194
MeshGeometry3D图

图2-195是【对象和时间线】面板呈现的1个三维对象元素的列表,可以看出上面所说的三维元素之间的关系。

图2-195
三维对象元素

图2-195中有1个Viewport3D控件,其中有1个Camera元素,1个名为“World”的三维元素ModelVisual3D,这是多个ModelVisual3D元素的集合,“AmbientLightContainer”、“DirectionalLightContainer”和“RootGeometryContainer”均属于ModelVisual3D元素,其中“RootGeometryContainer”元素又包含多个ModelVisual3D子元素,如“Cylinder01”、“Cylinder02”等。“Cylinder01”中又包含GeometryModel3D
元素。

时间: 2024-08-10 02:09:19

WPF中的三维空间(1)的相关文章

WPF中的三维空间(2)

原文:WPF中的三维空间(2) 2.10.3 三维对象操作 1.在二维平面空间移动.缩放.旋转Viewport3D控件对象         图2-196 选中Viewport3D控件对象      图2-197 二维平面空间中对象操作图标 [设计面板]实际上是X-Y平面,在[对象和时间线]面板上选中Viewport3D控件对象,同时选中[工具]面板中的"选择"工具,在[设计面板]中的选中的对象被平面蓝色边框(称二维边框)包围,边框上有8个选择点,如图2-196所示.图的中央有1个点是对

WPF中对三维模型的控制

原文:WPF中对三维模型的控制 (以下选自南开大学出版社出版的<WPF和Silverlight教程>) 3Dmax中的建模模型可以导出为obj文件格式,将此文件导入WPF项目中,由WPF完成对三维造型的贴图和控制设计.本例在3Dmax中设计了1个双翼开瓶器模型,将"开瓶器.obj"和贴图材质文件都添加到项目中("素材"文件夹).图2-206 的左侧是"开瓶器.obj"文件拖入到[设计面板]后,在[对象和时间线]面板中看到的结构,右侧是

WPF 中的 loaded 事件和 Initialized 事件

在 WPF 中, 控件有 Loaded 和 Initialized 两种事件. 初始化和加载控件几乎同时发生, 因此这两个事件也几乎同时触发. 但是他们之间有微妙且重要的区别. 这些区别很容易让人误解. 这里介绍我们设计这些事件的背景. (不仅适用于 Control 类, 同样在通用类如 FrameworkElement 和 FrameworkContentElement 类也适用.) 下面是个小故事: Initialized 事件只说: 这个元素已经被构建出来,并且它的属性值都被设置好了,所以

WPF中使用VisualBrush的实例

本文实现一个名为"你来我往"的小程序,该程序管理着"张三"和"李四"两位童鞋拥有的现金,一开始,两人均拥有100美元的现金,随着将现金从其中一人转移至另外一人,两人拥有的现金数在不断变化,程序可以跟踪这种变化,并正确显示每人拥有的现金数.每次最多可以转移三张纸币,纸币的金额可以是5美元.10美元或者20美元. 程序运行后的效果如图1所示,我们点击"张三"右边的"5美元""10美元"&qu

WPF中静态引用资源与动态引用资源的区别

WPF中静态引用资源与动态引用资源的区别 WPF中引用资源分为静态引用与动态引用,两者的区别在哪里呢?我们通过一个小的例子来理解. 点击“Update”按钮,第2个按钮的文字会变成“更上一层楼”,而第1个按钮的文字没有变化. 原因是第1个按钮文字用的是静态引用资源,而第2个按钮文字用的是动态引用资源. 前台代码: <Window x:Class="PersonalLearning.StaticDynamicResourceDemo"        xmlns="http

01.WPF中制作无边框窗体

[引用:]http://blog.csdn.net/johnsuna/article/details/1893319 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormBorderStyle属性设置为None来完成.如果要制作成异形窗体,则需要使用图片或者使用GDI+自定义绘制. 那么,在WPF中,我们怎样制作一个无边框窗体呢? 答案是将Window的WindowStyle属性设置为None,即WindowStyle="None" .如果是非矩形的异形窗体,则

在WPF中使用fortawesome之类的字体图标

我之前在博客中介绍过几个矢量图库网站,在WPF程序中,一般接触到的矢量图标资源有XAML.SVG.字体这三种格式.XAML是标准格式就不说了,SVG并不是直接支持的,不过微软提供了Expression Design可以非常方便我们将其转换为XAML格式的资源.而对于字体,虽然WPF是直接支持的,但由于字体图标其特殊性,要将其显示为图标还是需要费点劲的.本文这里就以Font-Awesome为例,介绍一下如何在WPF中使用字体图标. 首先添加一个样式,为了使用方便,建议直接做为全局样式: <Styl

WPF 中动态改变控件模板

在某些项目中,可能需要动态的改变控件的模板,例如软件中可以选择不同的主题,在不同的主题下软件界面.控件的样式都会有所不同,这时即可通过改变控件模板的方式实现期望的功能. 基本方法是当用户点击切换主题按钮是加载新的资源字典,并使用新加载的资源字典替代当前的资源字典这时要用到ResourceManager. 假设现有两个不同的资源字典文件Dictionary1.xaml和Dictionary2.xaml存在于Themes文件夹内: 在MainPage中使用其中一个资源字典作为默认样式文件: <Win

浏览器扩展系列————在WPF中定制WebBrowser快捷菜单

原文:浏览器扩展系列----在WPF中定制WebBrowser快捷菜单 关于如何定制菜单可以参考codeproject上的这篇文章:http://www.codeproject.com/KB/books/0764549146_8.aspx?fid=13574&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx 本文主要讲述如何在这篇文章中的ShowContextMenu方法中弹出自己的Conte