wpf之3d基础

简介: 原文:wpf之3d基础    关于3D方面的东西,本人只是浅尝辄止,从未曾在项目中使用过,相信有不少人也是基于一份兴趣去学习。这里将展示几个基本的WPF 3D编程,希望对初学者有一定帮助。     为帮助理解,这里全部使用C#代码构造,而不是写在XAML中,有兴趣的可以在这里下载源代码。
原文: wpf之3d基础

    关于3D方面的东西,本人只是浅尝辄止,从未曾在项目中使用过,相信有不少人也是基于一份兴趣去学习。这里将展示几个基本的WPF 3D编程,希望对初学者有一定帮助。

    为帮助理解,这里全部使用C#代码构造,而不是写在XAML中,有兴趣的可以在这里下载源代码。下面来先看下几个效果图。   

        

 

           

 

      下面就第一幅效果图做个基本的讲解。

      3D有三个重要元素,模型、灯光、视野。那我们现实来对比,我们要看到一个物体,首先这个物体要存在(即要构造一个模型),其次需要有灯光照在这个物体上(即要构造一个灯光,还要将灯光照在这个模型上,不然就看不见模型),然后我们要有视野,要用眼睛去看(就是说我们还要构造一个视野,而且模型要在这个视野中才能看的到)。

      而模型则有两部分组成,网格和纹理(附在材质上)。网格即为骨架,纹理为皮肤,二者缺一不可。网格由许许多多的三角形构成,下面的代码向你展示如何构造一个WPF 3D模型。

      由12个三角形构成一个立方体网格。

MeshGeometry3D meshg = new MeshGeometry3D();
Point3DCollection pc = new Point3DCollection();
pc.Add(new Point3D(-10,10,0));pc.Add(new Point3D(10,10,0));pc.Add(new Point3D(10,-10,0));pc.Add(new Point3D(-10,-10,0));
pc.Add(new Point3D(-10,10,-10));pc.Add(new Point3D(10,10,-10));pc.Add(new Point3D(10,-10,-10));pc.Add(new Point3D(-10,-10,-10));
meshg.Positions = pc;
Int32Collection ic = new Int32Collection();
ic.Add(0);ic.Add(2);ic.Add(1);ic.Add(0);ic.Add(3);ic.Add(2);
ic.Add(4);ic.Add(6);ic.Add(5);ic.Add(4);ic.Add(7);ic.Add(6);

ic.Add(4);ic.Add(3);ic.Add(0);ic.Add(4);ic.Add(7);ic.Add(3);
ic.Add(5);ic.Add(2);ic.Add(1);ic.Add(5);ic.Add(6);ic.Add(2);

ic.Add(4);ic.Add(1);ic.Add(5);ic.Add(4);ic.Add(0);ic.Add(1);
ic.Add(7);ic.Add(2);ic.Add(6);ic.Add(7);ic.Add(3);ic.Add(2);
meshg.TriangleIndices = ic;

      接下来,我们构造一个材质对象,这里就用一个简单的画刷作为材质的纹理。然后用这个材质和上面构造的网格构造一个3D模型。

   DiffuseMaterial dm = new DiffuseMaterial();
   dm.Brush = Brushes.Cyan;

   GeometryModel3D gm = new GeometryModel3D(); 
   gm.Geometry = meshg;
   gm.Material = dm;

      现在3D的模型已经建好了,我们给它加上灯光。

  DirectionalLight dl = new DirectionalLight ( );
  dl.Color = Colors.Blue;
  dl.Direction = new Vector3D ( 0, 0, -1 );

     接下来,将这个模型和灯光都放到一个3D集合中。本人的理解是模型和灯光都是实物,这个实物需要有个地方放,于是需要将这个3D集合放到一个空间中,这里是ModelVisual3D。

  Model3DGroup mg = new Model3DGroup();
  mg.Children.Add ( dl );
  mg.Children.Add(gm);
  ModelVisual3D mv = new ModelVisual3D();
  mv.Content = mg;

      至此,所有美好的东西都已经弄好了,剩下的就是一双发现美丽的眼睛了。现在,就将这个眼睛加上吧。这样一个完整的视野就构造出来了。

  Viewport3D myViewPort = new Viewport3D ( );
  myViewPort.Children.Add(mv);
  PerspectiveCamera camera = new PerspectiveCamera ( );
  camera.Position = new Point3D ( 0, 0, 80 );
  camera.UpDirection = new Vector3D ( 0, 1, 0 );
  camera.LookDirection = new Vector3D ( 0, 0, -20 );
  myViewPort.Camera = camera;

     好了,现在将这个视野放到我们的窗体中,myGrid.Children.Add ( myViewPort ),你就可以看到这个立方体了。下面是窗体代码。

<Window x:Class="_3dTest.Window1"        
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="350" Width="525"> <Grid Name="myGrid"> </Grid> </Window>

      纳尼,你只看到一个正方形?这就对了,我们现在的视野是在正方体的正前面,看到的自然只有正面了。现在我们将这个正方体转一下,你就可以多看几个面了。

 RotateTransform3D myTransform = new RotateTransform3D();
 myTransform.Rotation = new AxisAngleRotation3D(new Vector3D(0, 1, 0), 45);
 mv.Transform = myTransform;

     现在一个完整的入门例子已经完成了,希望对你有所帮助。

 

目录
相关文章
|
C#
WPF 3D动态加载模型文件
原文:WPF 3D动态加载模型文件 这篇文章需要读者对WPF 3D有一个基本了解,至少看过官方的MSDN例子。 一般来说关于WPF使用3D的例子,都是下面的流程: 1.美工用3DMAX做好模型,生成一个obj文件 2.程序然后打开Blender,将obj拖动到Blender中,生成xaml代码   但是这样做会有至少两个问题: 1. 维护麻烦,因为一旦模型修改,你需要重复上面的步骤,至少要修改xaml的代码。
1538 0
|
C#
WPF 3D模型的一个扩展方法
原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色。 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过材质进行渲染(DiffuseMaterial) 。
900 0
|
前端开发 C#
silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之番外 3D切换导航篇(Blend 4开发) 这篇介绍的是3D导航,点击图标,页面360°翻转的效果!有什么不足的欢迎大家指出来。 1.新建一个usercontrol,命名为menu. 2.按照下图设置一下属性。
1244 0
|
C#
WPF 3D 模型旋转
原文:WPF 3D 模型旋转     WPF 是 Microsoft 在 Framework3.0 中支持的一种技术,它能作出很绚丽的界面,同时它也支持3D的操作。在3D操作主要包括平移(Translate)、旋转(Rotation)、缩放(Scale)。
1371 0
|
测试技术 C#
[Songqw.Net 基础]WPF实现简单的插件化开发
原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/article/details/50895733 ...
1224 0
[Songqw.Net 基础]WPF插件化中同步Style
原文:[Songqw.Net 基础]WPF插件化中同步Style 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/article/details/50910590 ...
834 0
|
C#
使用WPF实现3D场景[一]
原文:使用WPF实现3D场景[一] 在这篇文章里,将介绍如何实现一个简单的三维场景,一个三维的空间,包括空间内的三维物体的组合. 首先介绍一下一个三维场景里的基本元素: 先是定义一个简单的三维的场景环境 代码如下: 以上是定义了一个名称叫做 myViewport 的的三维场景,接下来可以在这个三位场景里添加一些元素: 元素一:照相机 照相机是三维场景内用户的视角,当然照相机也是唯一的。
1619 0
|
C#
使用WPF实现3D场景[二]
原文:使用WPF实现3D场景[二] 在上一篇的文章里我们知道如何构造一个简单的三维场景,这次的课程我将和大家一起来研究如何用代码,完成对建立好了的三维场景的观察。
1140 0
|
C#
WPF利用HelixToolKit后台导入3D模型
原文:WPF利用HelixToolKit后台导入3D模型 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37591671/article/details/75044423 ...
3575 0
|
C# 前端开发 图形学
WPF实现3D翻转的动画效果
原文:WPF实现3D翻转的动画效果 1、前端代码实现 1.1 原理见代码注析 ...
2165 0