原文:wpf之3d基础

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

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

        

           

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

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

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

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

MeshGeometry3D meshg = new MeshGeometry3D();
Point3DCollection pc = new Point3DCollection();
pc.Add(new Point3D(-,,));pc.Add(new Point3D(,,));pc.Add(new Point3D(,-,));pc.Add(new Point3D(-,-,));
pc.Add(new Point3D(-,,-));pc.Add(new Point3D(,,-));pc.Add(new Point3D(,-,-));pc.Add(new Point3D(-,-,-));
meshg.Positions = pc;
Int32Collection ic = new Int32Collection();
ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();
ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();ic.Add(); ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();
ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();ic.Add(); ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();
ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();ic.Add();
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 ( , , - );

接下来,将这个模型和灯光都放到一个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 ( , , );
camera.UpDirection = new Vector3D ( , , );
camera.LookDirection = new Vector3D ( , , - );
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(, , ), );
mv.Transform = myTransform;

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

最新文章

  1. spark2.0.1 安装配置
  2. MVVM架构~knockoutjs与MVC配合,实现列表的增删改功能
  3. Linux网络状态工具ss命令使用详解
  4. AccessHelper
  5. WEB安全攻防学习内容
  6. 【python cookbook】【数据结构与算法】13.通过公共键对字典列表排序
  7. mvc模式实现
  8. mysql 区间锁 对于没有索引 非唯一索引 唯一索引 各种情况
  9. (?m) 可以让.去匹配换行
  10. 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑
  11. linux开发
  12. 使用 JS 实现文字左右跑马灯
  13. this inspection detects names that should resolved but don&#39;t. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are sup
  14. MapReduce(一)
  15. monit
  16. vsftpd的配置文件说明
  17. PHP表单- PHP $_GET 变量
  18. 来自MSDN的RibbonGadgets练习
  19. Mysql存储之ORM框架SQLAlchemy(一)
  20. awk二十问-【AWK学习之旅】

热门文章

  1. 数据结构与算法实验题 9.1 K 歌 DFS+剪枝
  2. 【2047】求前n个完全数
  3. GAN(Generative Adversarial Networks) 初步
  4. 从Ecipse中导出程序至apk 分类: H1_ANDROID 2013-10-26 22:17 516人阅读 评论(0) 收藏
  5. jquery插件课程2 放大镜、多文件上传和在线编辑器插件如何使用
  6. adobe-flash-player离线下载方法
  7. 通过select下拉框里的value控制div显示与隐藏
  8. Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 10 in
  9. 浏览器对象模型bom的作用是什么?
  10. PHP数组foreach循环如何实现逆序访问?