专业实训9.7

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;

博客转发自http://www.cnblogs.com/Fuss/archive/2012/11/29/2794780.html(已争取博主同意)

时间: 2024-10-08 16:47:29

专业实训9.7的相关文章

专业实训8.29

1.本日任务 确定专业实训题目,并查相关学习资料进行学习. 2.题目确定 通过在中国大学生软件设计大赛网站:http://www.cnsoftbei.com/所给出的相关题目中选出自己所看重的题目——基于web的3D模型浏览与交互系统. 3.选题图片 4.选题心路历程 根据所给题目中大多数含有和涉及到硬件操作,鉴于本人分组只是一人一组,操作硬件起来会更加苦难,所以选择一个多为软件操作目:选题结果跟姜中希组相同,但保证只会在大体思路上回有所相同但不会出现代码上的冲突和相似. 5.8月29日任务完成

2016年秋季软件工程专业实训分组及选题情况

实训意义 综合实训旨在为学生提供参与完整软件开发过程的实践经历,并对所涉及的应用领域进行初步了解,培养面向领域的工程能力.项目来源主要是学校或相关合作企业在校内设立专门的学生研究开发项目,可以聘请企业专家组织和指导学生模拟企业环境进行项目开发,给学生带来真实的企业研发的环境和流程.     实训目标 (1)训练学生软件开发流程和规范:体会企业开发流程:熟悉常用开发工具.模板和表格的使用: (2)体会企业中的团队合作规范:培养团队开发和协同工作的能力:熟悉团队成员在软件开发项目中的角色分工及沟通协

专业实训9.5

1.实训时间:2016.9.5上午8:00-11:30 2.实训内容:项目在完成.x文件的固定导入后,尝试文件旋转,缩小,放大功能的开发. 3.具体实现:通过网上百度的源代码,进行阅读和修改. 具体为摄像头的处理. 阅读代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Lin

专业实训题目需求分析

现在云办公是十分流行的办公方式,并且已经得到了一定程度上的应用,有针对性并且相对成熟的云办公软件是很多机关所需要的,实现云办公,这便是该软件的业务需求.该软件的用户类型主要是“团队型”客户,即有一定数量,并且不同用户司职可能相同也可能不同,但本质上是有领导和被领导的关系的,领导可以发布开会时间,地点,会议内容等等,而员工(被领导者)可以根据不同的职位发表最近的工作总结,建议等等相关内容,会议记录也可以存档.用户的需求在于,应用网络实现在线会议,签到等等需求(当然相关功能,该软件已经初步实现),软

专业实训项目需求分析

                     Magic 业务需求:给使用者提供朋友聚会间的一个小魔术,来活跃气氛或增进关系等功能.面向用户的类型:解决了在聚会上大家都沉默不语,各自玩手机的现象.通过这个小软件来表现魔术,吸引大家的注意力,从而使聚会变得更有趣,也更具有增进关系的作用.用户需求:只要你有手机和硬币,可以随时随地的表演魔术.软件需求:界面背景是一个透明的界面,可以直接显示手机原本界面,通过振动感应器来显示一个硬币图案,再次震动就会消失.通过此原理产生硬币进入手机的假象.

专业实训题目需求分析(3D推箱子)

业务需求:    游戏提供主菜单让玩家进行游戏设置.帮助说明,推箱子的小人可以前后左右转动,箱子可以被上下左右的推动,要有关卡设置,障碍物设置,游戏提供背景音乐的功能,要实现3D效果. 面向的用户类型:会使用手机软件的人 用户需求:可以对游戏进行设置,可以上下左右的推箱子,移动小人,要有关卡的转换,有个美好的体验. 软件需求:用户可以对游戏进行设置,用户通过移动小人来改变箱子的位置,游戏每关的关卡都要不一样,有独特的地图,给用户一个美好的体验.

专业实训9.10

首先在开头,先祝愿天下的所有老师教师节快乐! WPF本身并没有为我们提供文件浏览的控件, 也不能直接使用Forms中的控件,而文件浏览对话框又是我们最常用的控件之一. 下面是我实现的方式 接下来呢!进入正题 要在项目文件中添加一个打开的对话框操作. 具体实现方式有四个(一一列举,就当给自己科普啦!): 方式1: 使用win32控件OpenFileDialog ? 1 2 3 4 5 6 7 Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Wi

专业实训9.1

安装配置Directx9.0Sdk 1.下载Directx9.0Sdk包(百度中搜索),下载安装后直接点击安装. 2.安装结束后可能会出现(安装错误) 错误原因: 计算机上有安装过更新版的Microsoft Visual C++ 2010 Redistributable,打开“控制面板”的“程序和功能”,果然计算机里之前有安装“Microsoft Visual C++ 2010 x86 Redistributable - 1010.0.40219”,而DXSDK_Jun安装的是“Microsof

专业实训9.4

上次开发结束,开发到在窗体中天剑一个Panel控件,使得3d的效果图像在Panel中显示,今天我们继续向后面开发. 完成功能:简单载入3d模型 1.添加初始化图形设备 PresentParameters presentParams = new PresentParameters();//设置变量 设置其在窗口模式下运行,并将交换效果为Discard:创建设备. 2.导入3d模型函数 private void LoadMesh(string file) { ExtendedMaterial[] m