原文: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;

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

wpf之3d基础的更多相关文章

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

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

  2. 2000条你应知的WPF小姿势 基础篇<1-7>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  3. wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)

    原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依 ...

  4. 2000条你应知的WPF小姿势 基础篇<8-14>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...

  5. 从零3D基础入门XNA 4.0(2)——模型和BasicEffect

    [题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...

  6. 从零3D基础入门XNA 4.0(1)——3D开发基础

    [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...

  7. [WPF系列]从基础起步学习系列计划

    引言 WPF技术已经算不什么新技术,一搜一大把关于WPF基础甚至高级的内容.之前工作中一直使用winform所以一直没有深入学习WPF,这次因项目中使用了WPF技术来实现比较酷的展示界面.我在这里只是 ...

  8. rotate 3d基础

    基础 看了岑安大大的教程学习了3d基础,之前写了篇总结,觉得写的太散废话太多,重写一篇. 本文需要实现的效果如下:3d球 岑安的两篇教程写的很棒,但我感觉改变下顺序或许会更好理解. 我们把画布(此文所 ...

  9. WPF 绑定以基础数据类型为集合的无字段名的数据源

    WPF 绑定以基础数据类型为集合的无字段名的数据源 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-21 我们在控件的数据绑定 ...

随机推荐

  1. Swift 中异常抛出和四种异常处理

    在Swift中你可以像其他语言一样抛出异常处理异常,今天我们就详细地说说Swift中的异常抛出和处理. 在一开始我们要定义错误或者说是异常,Swift中的一些简单异常可以使用枚举定义,注意这个枚举要继 ...

  2. 关于stm32的RAM大小

  3. 关于JavaScript对象概念的总结

    原文 https://www.jianshu.com/p/88213b499c4b 大纲 前言 1.对象的相关概念 2.对象的创建(简单创建) 3.对象的属性 3.1.数据属性 3.2.访问器属性 4 ...

  4. angular的学习参考材料

    原文地址:https://www.jianshu.com/p/b9db7bb3d4ec 目的 其实写这篇文章的主要目的是为了提供给那些刚刚入门angular或者有意学习angular的读者准备的. 我 ...

  5. 通过onTouch来确定点击的是listView哪一个item

    事实上这主要是用了ListView的一个方法,通过坐标就能够确定当前是哪一个listView,别的我就不多说了直接看看代码吧, lv_flide.setOnTouchListener(new OnTo ...

  6. iOS开发SDWebImage的基本使用

    #import "ViewController.h" #import "UIImageView+WebCache.h" #import "SDWebI ...

  7. HtmlParser基础教程 分类: C_OHTERS 2014-05-22 11:33 1649人阅读 评论(1) 收藏

    1.相关资料 官方文档:http://htmlparser.sourceforge.net/samples.html API:http://htmlparser.sourceforge.net/jav ...

  8. Zookeeper实战之嵌入式执行Zookeeper集群模式

    非常多使用Zookeeper的情景是须要我们嵌入Zookeeper作为自己的分布式应用系统的一部分来提供分布式服务.此时我们须要通过程序的方式来启动Zookeeper.此时能够通过Zookeeper ...

  9. 使用AJAX实现页面跳转

    $.ajax({ type:"POST", url: //你的请求程序页面随便啦 async:false,//同步:意思是当有返回值以后才会进行后面的js程序. data://请求 ...

  10. NBU7.0 RMAN 异机恢复 not found in NetBackup catalog

    问题描写叙述: RMAN>  run { 2>  allocate channel t1 type 'sbt_tape'; 3>  send 'NB_ORA_SERV=netback ...