博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wpf之3d基础
阅读量:5355 次
发布时间:2019-06-15

本文共 2636 字,大约阅读时间需要 8 分钟。

原文:

    关于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 ),你就可以看到这个立方体了。下面是窗体代码。

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

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

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

 

posted on
2018-10-22 15:36 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/9830384.html

你可能感兴趣的文章
【iOS开发-68】APP下载案例:利用tableView自带的cell布局+缓存池cell复用时注意button状态的检查...
查看>>
《Genesis-3D开源游戏引擎-FQA常见问题解答》2014年01月10号版本
查看>>
Java 编程下实现随机无重复数字功能
查看>>
Android 编程下的代码混淆
查看>>
animation属性
查看>>
页内的模块和组件抽象规划经验
查看>>
安全-分析深圳电信的新型HTTP劫持方式
查看>>
将Centos的yum源更换为国内的阿里云源
查看>>
git diff 的用法
查看>>
一段sql的优化
查看>>
十进制与十六进制的相互转换
查看>>
在Flex中用Validator检测数字、字符串、Email.
查看>>
[leetcode]4Sum
查看>>
POJ1062 昂贵的聘礼
查看>>
【零基础学习iOS开发】【02-C语言】08-基本运算
查看>>
雷林鹏分享Node.js JXcore 打包
查看>>
常见错误总结
查看>>
BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
查看>>
Django框架(十九)--Django rest_framework-认证组件
查看>>
我的MFC/C++学习笔记 http://blog.bccn.net/CrystalFan/6909
查看>>