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-07-28 13:38:38

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

WPF中的三维空间(2)

原文:WPF中的三维空间(2) 2.10.3 三维对象操作 1.在二维平面空间移动.缩放.旋转Viewport3D控件对象                                                                   图2-196 选中Viewport3D控件对象      图2-197 二维平面空间中对象操作图标 [设计面板]实际上是X-Y平面,在[对象和时间线]面板上选中Viewport3D控件对象,同时选中[工具]面板中的"选择"工具,在[设

WPF中对三维模型的控制

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

UI前沿技术-WPF中的多点触控操作事件

就在过去几年,多点触控还只是科幻电影中表现未来主义的一种重要手法,现在俨然已经成为主流的用户界面技术.多点触控显示屏现在成了新型智能手机和 Tablet 计算机的标准显示屏.此外,它还可能在公共场所的计算机上普及,例如 Microsoft Surface 率先开发的网亭或桌面计算机. 实际存在的唯一不确定因素是多点触控在常规台式计算机上的普及.这种普及的最大障碍或许是长时间在垂直屏幕上移动手指所产生的疲劳(称为"大猩猩手臂").我个人希望多点触控的强大功能将切实推进桌面显示屏的重新设计

WPF中如何使用行为示例:Canvas控件拖放行为的演示

1.获取行为的支持,安装Expression Blend 4 SDK(http://www.microsoft.com/zh-cn/download/details.aspx?id=10801) . 2.创建行为库 (1)创建一个Class Project,添加WPF必备的以及WPF中支持行为必备的dll文件. 其中,System.Windows.Interactivity.dll组件在目录(需要安装Blend SDKs):C:\Program Files (x86)\Microsoft SDK

WPF中的Style(风格,样式)

在WPF中我们可以使用Style来设置控件的某些属性值,并使该设置影响到指定范围内的所有该类控件或影响指定的某一控件,比如说我们想将窗口中的所有按钮都保持某一种风格,那么我们可以设置一个Style,而不必分别设置每个按钮的风格. Style是作为一种资源被保存下来的. 看下面的例子: <Window.Resources>        <Style TargetType="Button">       <Setter Property="Fore

WPF 中 ICollectionView 及 ItemsControl 相关的重点

为 OEA 框架 做 WPF 树型表格控件时,浪费了许多时间在一些知识点上,所以写了这篇博客总结一下,和各位博友分享.   ICollectionView 接口的简易使用方法   它的 SortDescriptions.GroupDescription 等属性会影响视图的结构,一般情况下会自动刷新. 也可以直接使用 Refresh 方法来命令视图的刷新(内部实现一般为重建内部视图模型集合). 如果是批量操作,也可以使用 RefreshDefer 方法来抑制多次刷新,待多个更新操作后再统一刷新.

WPF中使用MediaElement控件来进行音视频播放

WPF中可以使用MediaElement控件来进行音视频播放,然后需要做个进度条啥的,但是MediaElement.Position(进度)和MediaElement.NaturalDuration居然都不是依赖属性,简直不能忍! 好吧,首先说说比较传统的做法(winform?) slider用来显示进度以及调整进度,tb1显示当前进度的时间值,tb2显示视频的时长. player_Loaded 事件中使用DispatcherTimer来定时获取当前视频的播放进度, player_MediaOp

在WPF中自定义你的绘制(五)

将我们的绘制转变为画刷 WPF中的画刷比GDI+中要强大得多,除了常用的实心画刷.渐变画刷外,还支持更多的平铺画刷,这包括DrawingBrush.ImageBrush.VisualBrush,其中DrawingBrush使得我们可以将自定义的绘制用于任何可以使用普通画刷的地方. 比如下面的代码,我们将自定义一个椭圆和一个矩形,然后将它们合并成一个图形并将 改图形用作窗口的背景画刷: public Window1() { InitializeComponent(); //background E

在WPF中自定义你的绘制(一)

在传统的Windows窗体编程中,如果我们需要打造一些比较个性化的控件,那么我们常常需要自定义控件的绘制(重写OnPaint等),即需要经常用到Graphics对象.而在WPF中,我们可以使用Xaml轻松编写出很有特色的界面元素,似乎与以前的以前利用Graphics对象手写代码绘制控件的日子越来越远了.其实在WPF中,如果我们需要低级别的自定义绘制同样是可以的,那么我们就需要一个名DrawingContext的类.与OnPaint方法相对应的是OnRender方法(当然,你也可以在其他地方进行绘