wpf之3d基础
原文: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;
现在一个完整的入门例子已经完成了,希望对你有所帮助。
最新文章
- spark2.0.1 安装配置
- MVVM架构~knockoutjs与MVC配合,实现列表的增删改功能
- Linux网络状态工具ss命令使用详解
- AccessHelper
- WEB安全攻防学习内容
- 【python cookbook】【数据结构与算法】13.通过公共键对字典列表排序
- mvc模式实现
- mysql 区间锁 对于没有索引 非唯一索引 唯一索引 各种情况
- (?m) 可以让.去匹配换行
- 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑
- linux开发
- 使用 JS 实现文字左右跑马灯
- 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
- MapReduce(一)
- monit
- vsftpd的配置文件说明
- PHP表单- PHP $_GET 变量
- 来自MSDN的RibbonGadgets练习
- Mysql存储之ORM框架SQLAlchemy(一)
- awk二十问-【AWK学习之旅】
热门文章
- 数据结构与算法实验题 9.1 K 歌 DFS+剪枝
- 【2047】求前n个完全数
- GAN(Generative Adversarial Networks) 初步
- 从Ecipse中导出程序至apk 分类: H1_ANDROID 2013-10-26 22:17 516人阅读 评论(0) 收藏
- jquery插件课程2 放大镜、多文件上传和在线编辑器插件如何使用
- adobe-flash-player离线下载方法
- 通过select下拉框里的value控制div显示与隐藏
- Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 10 in
- 浏览器对象模型bom的作用是什么?
- PHP数组foreach循环如何实现逆序访问?