WPF 3D编程介绍
上一篇文章简单的介绍了WPF编程的相关的内容,也推荐了本书。今天要来讲一下在WPF如何开展3D编程。
使用的xmal 和C#开发的时候:需要使用如下的关键要素:
1:摄像机,是用来模拟成像的,现在WPF支持正交(orthographical )和透视(perspective )摄像机。你需要确定它的位置(position),镜头正对的方向(LookDirection),还有就是摄像机的向上方向(UpDirection),如果不是很明白这个属性,可以参考http://topic.csdn.net/u/20090214/23/f8201d15-be5c-483d-ac97-c0a33151e8fb.html。
2:3D模型:一个3D模型定义了场景中的一个物体,包含一个Geometry对象 。Geometry对象是一个网格,和一个材质(Material )对象,材质具有漫反射(diffuse),镜面(specular )或放射(emmisive )几种类型,材质本身具有一个画刷。如果想对材质进一步的了解,可以看:http://app.cnzer.cn/html-85837-1.html,上面有对网格的详细解释。
3:光源: 如果场景中没有光源,你将什么也看不到。因此我们需要在我们的场景当中至少放置一个光源来照亮我们的模型。WPF支持如下几种不同的光源:AmbientLight (自然光),DirectionalLight (方向光)PointLight (点光源),SpotLight (聚光源)。你需要确定光源的方向(Direction),颜色(color)等属性
4:viewport3D控件:这个控件类似容器,放入上述的元件。其实在c#编程的时候,你会发现camera等式viewport3D的成员属性。
下面是一个c#改写的,源程序来自http://www.w3ceye.com/article.asp?id=45:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Media.Media3D;
namespace WPF3D1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
Viewport3D vp = new Viewport3D();
public MainWindow()
{
InitializeComponent();
this .Content = vp;
SetupCamera();
GetModelVisual3D();
}
private void SetupCamera()
{
PerspectiveCamera camera = new PerspectiveCamera();
camera.Position = new Point3D( - 40 , 40 , 40 );
camera.UpDirection = new Vector3D( 0 , 0 , 1 );
camera.LookDirection = new Vector3D( 40 , - 40 , - 40 );
vp.Camera = camera ;
}
private void GetModelVisual3D()
{
Model3DGroup mg = new Model3DGroup();
DirectionalLight dl = new DirectionalLight();
dl.Color = Colors.White; dl.Direction = new Vector3D( - 1 , - 1 , - 3 );
GeometryModel3D gm = new GeometryModel3D();
MeshGeometry3D meshg = new MeshGeometry3D();
Point3DCollection pc = new Point3DCollection();
pc.Add( new Point3D( 0 , 0 , 0 ));pc.Add( new Point3D( 10 , 0 , 0 ));pc.Add( new Point3D( 10 , 10 , 0 ));
pc.Add( new Point3D( 0 , 10 , 0 ));pc.Add( new Point3D( 0 , 0 , 10 ));pc.Add( new Point3D( 10 , 0 , 10 ));
pc.Add( new Point3D( 10 , 10 , 10 ));pc.Add( new Point3D( 0 , 10 , 10 ));
meshg.Positions = pc;
Int32Collection ic = new Int32Collection();
ic.Add( 0 );ic.Add( 1 );ic.Add( 3 );ic.Add( 1 );ic.Add( 2 );ic.Add( 3 );ic.Add( 0 );ic.Add( 4 );ic.Add( 3 );
ic.Add( 4 );ic.Add( 7 );ic.Add( 3 );ic.Add( 4 );ic.Add( 6 );ic.Add( 7 );ic.Add( 4 );ic.Add( 5 );ic.Add( 6 );
ic.Add( 0 );ic.Add( 4 );ic.Add( 1 );ic.Add( 1 );ic.Add( 4 );ic.Add( 5 );ic.Add( 1 );ic.Add( 2 );ic.Add( 6 );
ic.Add( 6 );ic.Add( 5 );ic.Add( 1 );ic.Add( 2 );ic.Add( 3 );ic.Add( 7 );ic.Add( 7 );ic.Add( 6 );ic.Add( 2 );
meshg.TriangleIndices = ic;
DiffuseMaterial dm = new DiffuseMaterial();
dm.Brush = Brushes.Red;
gm.Geometry = meshg;
gm.Material = dm;
mg.Children.Add(dl);
mg.Children.Add(gm);
ModelVisual3D mv = new ModelVisual3D();
mv.Content = mg;
vp.Children.Add(mv);
}
}
上面讲到的这些中,有一个重要的问题没有提到,就是3的模型是如何获得的,一般教程都会将使用3D建模软件生成一些数据,然后来进行设计。这是怎么回事,原来.Net没有直接提供可以生成3D模型的工具,然而直接想的话,会很复杂,所以要使用3D建模软件,那使用什么软件呢?
1,3d max,这个软件可以生成一些坐标点,然后用于上面程序中涉及到的网格的位置和朝向的直接赋值。
2,Electric Rain ZAM 3D
Electric Rain ZAM 3D是一个功能齐全的3D建模软件,可轻松创建,定制和动画基于Windows Vista(win7也行) 应用的3D界面要素。 一旦创建三维场景,Electric Rain ZAM 3D自动生成XAML(扩展应用程序标记语言)标记,转换成一个三维要素的Windows Presentation Foundation "WPF三维场景。 XAML的创建的文件可直接集成到您的应用程序开发环境,创造丰富,用户体验前所未有。这个软件现在又15天的试用期。
可以到如下网站去下载:http://www.erain.com/products/zam3d/DefaultPDC.asp。
3,Electric Rain Swift 3D 6
Swift 3D 是专业的矢量3D软件,它的出现充分弥补了Flash在3D方面的不足,它以娇小的身躯强大的功能位居Flash第三方软件第一位。拥有Swift 3D,从此放飞你的创意,让你的大脑做360度的旋转!Electric Rain的Swift3D是一个基于矢量的3D创作工具,设计师们能够迅速地从字体、基本3D元素和已有SWF格式3D模型创建3D图像。Swift 3D这个能够方便制作3D Flash的小软件已经得到大家的熟悉和喜爱.它不再仅仅局限于制作简单三维效果的Flash动画,更在文字、材质、建模、渲染等方面新增了很多功能,可以称得上是一个准专业级的3D 设计软件了! 新版 支持XAML 包括WPF 和silverlight !
(上面两个介绍来自http://blog.csdn.net/luozhuang/archive/2009/11/13/4808444.aspx)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kotlin 视频教程系列 陈光剑
第1讲 快速开始 HelloWorld 第2讲 Kotlin 语法基础 第3讲 Kotlin 类型系统 第4讲 Kotlin 中的类与面向对象编程 第5讲 Kotlin 中的函数、Lambda与函数式编程 第6讲 扩展函数与属性 第7讲 集合类 第8讲 泛型 第9讲 文件IO操作、正则表达式与多线程 第10讲 使用 Kotlin 创建 DSL 第11讲 运算符重载与约定 第12讲 元编程与注解、反射 第13讲 Kotlin + SpringBoot 服务端开发 第14讲 使用 Kotlin 进行 Android 开发
- 下一篇
js判断是否安装某个android app,没有安装下载该应用(websocket通信,监听窗口失去焦点事件)
现在经常有写场景需要提示用户下载app, 但是如果用户已经安装,我们希望是直接打开app。 实际上,js是没有判断app是否已经安装的方法的,我们只能曲线救国。 首先,我们需要有call起app的schema, 以及一个下载地址,比如: var schema = 'myApp://main'; var downUrl = 'https://yourmain.com/downloadUrlTag'; 一、使用websocket通信实现页端和app的通信 1. android app需要实现websocket的连接功能,开放一个特定的端口如8899; 2. 页端js建立websocket连接 1 var download = function (schema, downUrl) { 2 var ws = "ws://localhost:8899/websocket"; 3 4 function onMessage(event) { 5 if (event.data != 'SUCCESS') { 6 console.log(event.data + "!= 'SUCCESS'"); 7 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启