WPF--3Dmax+blend+WPF综合运用

引自:http://blog.sina.com.cn/s/blog_95dbdf9e0100we3z.html

本人小菜,WPF刚入门,只是写一下最近的项目心得。欢迎各位前辈们前来拍砖指正,感激不敬!先申明,小弟我入门仓促,很多东西也是一知半解,所以很多问题甚至是不求甚解,所以大神们就直接绕路算了。

总结一:3D max+blend+WPF综合运用

开发环境:

Autodesk 3ds Max Design 2012

Micosoft Expression Blend 4 ,

Microsoft Visual Studio 2010

小弟之前参加一个项目,得用到WPF3D编程,但是WPF的3D只有最基本的3D场景元素,比如摄像机,光照等。如果想要在WPF中画一个正方体或者球 体,都得自己一步一步的把每个网格点的坐标算好,三角网格的顶点顺序添加好,设置法向量,贴图的话也得自己指定好对应的顶点坐标。画个简单的模型都如此麻 烦了,稍微复杂点的模型,只能依赖第三方建模软件来构建模型,然后把模型转换成松散的XAML文件,才能导入到WPF中去,或者把模型的相应XAML代码 直接嵌入到程序中去。

工欲善其事必先利其器,下面是我找到的相关工具和相关示例,有些我自己也没用过:

1.  3D Max Studio有导出XAML的插件:http://max2xaml.codeplex.com/

2. 还有开源的Blender: http://www.blender.org/ 以及相应的导出XAML的插件:

http://xamlexporter.codeplex.com/

3. 还有Viewer3ds-3ds to xaml converter: http://www.wpf-graphics.com/Viewer3ds.aspx

4. WPF(c#)有专门的3D建模工具,使用起来和3DMax差不多,制作完成后可直接导出XAML语言方便快捷:ZAM 3D : http://www.erain.com/products/zam3d/DefaultPDC.asp

示例:

1.WPF加载obj格式的3D模型:http://www.pin5i.com/showtopic-26486.html

2.3ds Max建模,Blend设计,VS2008控制WPF的3D模型例

http://www.cnblogs.com/foundation/archive/2008/05/23/1205892.html

http://www.cnblogs.com/couhujia/archive/2010/07/28/1787103.html

http://zhouwenqi.com/blog/board_33.html

现在网上可以下载到很多绚丽逼真的3D模型,模型有很多格式,我们这次之所以选择了.Max格式,因为网上很多模型(尤其是游戏角色原型)都是.max格式,其他的格式大多都可以在3Dmax中打开,然后再保存为.max格式。

小弟的3Dmax门都没入,项目做到一半恨不得马上找一个传设的女友帮我建模做美工,无奈之下,去图书馆速度借了2本3Dmax的书,需要的时候啃两下,因此只掌握了最基本的模型导入,导出和修改合成的功能。

下面以一个游戏角色原型(诛仙中的某个武士)为例,这个原型是在网上下载的,具体网址是我忘记了。在3Dmax中打开这个模型后,可以随心所欲的修改,肢解,或合体。

提醒:打开模型时如何文件单位比例和系统单位比例不匹配时,就会弹出以下的对话框让你选 择。选择哪个都无所谓,按自己的需要选择吧!但如果两者比例相差太大,比如下面的系统单位比例是1单位=1cm,而文件单位比例是1单位=1m,如果按系 统单位打开的话,模型可能在3dmax视图中过大,没能在3Dmax视图中显示出来或者只显示模型的局部,这时选择右下角这个按钮() 就可以最大化显示选定对象。


选择保存类型为obj格式,然后给文件命名为man1,再点击保存,就会有如下“OBJ导出选项”的对话框:


单纯的obj格式是不带贴图的,想要把贴图一同导出的话得勾选材质选项的“导出材质”“创建材质库”,同时点击“材质导出”按钮,就会弹出“OBJ Map-Export选项”对话框,在这里可以选择图片保存的格式和大小。然后选择“导出”,obj,mtl和相应的贴图图片文件就会在3dmax的export文件夹下,贴图信息存放到.mtl,具体的贴图则存放到Maps文件夹下。

提醒:导出时如果出现“缺少贴图”的对话框,得“手动搜索路径”,如果跳过的话只会有mtl和obj文件,而不会有具体的贴图文件。搜索路径一般为原模型的所在的路径,因为.dds格式的文件一般都和.max模型文件一起。

然后打开Blend 4,新建项目->WPF应用程序,单击确定。


选择“项目”->“添加现有项”,出现下面对话框,把man1.mtl和man1.obj两个文件添加到项目中去。此时,双击man1.obj文件 就可以把不含贴图的模型载入到当前工程中。拖拽右下角的正方形边框可以控制模型大小,一般情况下就可以看到不带贴图的模型了,大多都是光秃秃的单调灰白 色。


但是为什么我这里什么也看不见呢?仔细看看,Blend确实已经载入模型了(如下图):


只不过我遇到稍微特殊情况,不是看不到,是因为“漫射材料”的“纹理画笔”或者“漫射颜色”设为透明了。稍微修改一下就可以看到模型了,比如我这里修改裤子模型的“漫射材料”的“纹理画笔”和“漫射颜色”的A值设为100%,即不透明,就可以看到单调的灰色模型。


但这样的模型肯定没有漂亮的贴图,只有单调颜色,所以需要我们自己加载相应的贴图。当时我很郁闷,因为Blend4的用户指南上说了“在导入三维对象(.obj 文件)时,同时导入任何相关的材料文件 (.mtl) 以及材料文件中使用的所有图像文件很重要。如果丢失了任何图像文件,以后将无法添加这些文件”。因此看来是我没导入图片文件的缘故,于是马 上“添加现有项”,把四个贴图文件加载到项目中,依然看不到带贴图的模型,在这里郁闷良久,找不到解决的方法,只得自己手动为每个模型加载贴图了。这其实 是一条远路,近路后来发现了,后面会介绍。比如为头部添加纹理图片,效果如下:


全部添加完成之后,运行程序,如下:

在Blend中还可以对模型进行基本的调整,诸如放缩,旋转,平移等操作。

然而依然有不足之处,贴图细节处依然有问题。比如Blend中的模型背面和3Dmax元模型的背面差别如下:估计是因为贴图坐标不对应造成的,用 3Dmax导出的图片直接在Blend里贴的话,达不到原来的效果。或者说目前我们做不到,可能美工大神们做得到。这些应该属于美工那边的。哎。


然后可以用VS2010打开Blend4中所创建的WPF项目,可以在VS2010中继续添加相应的交互界面和控制按钮,这里就不唠叨了,自己啃书去吧!

继续纠结用户指南中的“在导入三维对象(.obj 文件)时,同时导入任何相关的材料文件 (.mtl) 以及材料文件中使用的所有图像文件很重要。如果丢失了任何图像文件,以后将无法添加这些文件”这句话的深意,我猜测是贴图路径问题,贴图的信息是由3Dmax导出的,且存在mtl格式文件中,后来打开mtl文件,才发现贴图文件前面都有一个maps文件路径(如下),果然如此。

于是赶紧在项目中新建一个maps文件夹,然后把贴图加载到这个文件夹下,再双击obj文件,这时Blend就自动帮咱们贴图了。但是缺陷依然存在,和之 前提到的不足之处一摸一样,背面的贴图自动贴的和手动贴的效果一样,效果和原始3Dmax模型还是有一些差别的,这已经超出IT码农范畴了,去找个美工妹 子吧!

总结二:WPF载入松散的XAML模型

我们的项目需要把3Dmax模型载入到WPF中,主要涉及模型的存放、导入和控制。

首先是模型的存放问题。前面用3Dmax模型在Blend中设计,之后用VS2010打开这个项目后,会发现模型对应的相应的xaml代码已经嵌入到程序 中了。如果多个模型怎么办?不可能把每个模型对应的xaml代码敲入到程序中,这样既不美观也不利于后面的模型各自控制。

于是得把模型的xaml代码抠出来,放到txt中,再重命名为xaml格式,就是一个松散的xaml模型文件了。

其次是模型的导入。存放到xaml文件中的模型如何导入到wpf中,主要通过文件流FileStream打开,然后用XamlReader加载,根据不同 的模型类型加载到不同类型的变量里。一般松散的xaml模型类型有GeometryModel3D,Model3Dgroup等,看自己的需要去转换。

public void LoadModel(ref GeometryModel3D _model, string path)

{

if (path != null && File.Exists(path))

{

using (FileStream file = File.OpenRead(path))

{

_model = (GeometryModel3D)XamlReader.Load(file);//

}

}

}

public void LoadModel(ref Model3DGroup _model, string path)

{

if (path != null && File.Exists(path))

{

using (FileStream file = File.OpenRead(path))

{

_model = (Model3DGroup)XamlReader.Load(file);

}

}

}

最后是模型的控制,如何根据Kinect中提供的肢体数据实时变换模型姿势,我们只是把衣服切成一块块生硬地挂在骨骼节点上,没有考虑一切物理效应,诸如 重力,碰撞检测,骨骼蒙皮等效果。因为WPF的3D功能没那么强大,除非得借助其他的游戏引擎才行,或者自己从底层编写,当时时间紧迫,只能生硬地把模型 切割,再分块贴上去。Kinect的骨骼数据提供的XYZ空间坐标方位,那么2个骨骼点间连线的角度和方向都很容易计算,然后把模型通过一系列的平移,旋 转,放缩变化放到相应的骨骼点上。

为了达到增强现实的效果,在WPF界面中,Viewport3D和显示原始视屏流Image控件的大小一摸一样,位置完全重合。然后把Camera放在空 间坐标系坐标零点,这样Camera就和真实空间中的Kinect传感器的位置,朝向一致了。所以,Viewport3D中的虚拟效果正好可以覆盖在底层 视屏中的人身上,达到增强现实的效果。但是会有小小的偏差,源于Kinect骨骼数据不是很精确,所以还需要自己手动修正一些细节,从而让效果更真实点。

原文地址:https://www.cnblogs.com/DreamRecorder/p/9530541.html

时间: 2024-10-11 17:04:10

WPF--3Dmax+blend+WPF综合运用的相关文章

3Dmax+blend+WPF综合运用

原文:3Dmax+blend+WPF综合运用 赛后总结 本人小菜,WPF刚入门,只是写一下最近的项目心得.欢迎各位前辈们前来拍砖指正,感激不敬!先申明,小弟我入门仓促,很多东西也是一知半解,所以很多问题甚至是不求甚解,所以大神们就直接绕路算了. 总结一:3D max+blend+WPF综合运用 开发环境: Autodesk 3ds Max Design 2012 Micosoft Expression Blend 4 , Microsoft Visual Studio 2010 小弟之前参加一个

WPF--之(3Dmax+blend+WPF)综合运用

引自:http://blog.sina.com.cn/s/blog_95dbdf9e0100we3z.html 本人小菜,WPF刚入门,只是写一下最近的项目心得.欢迎各位前辈们前来拍砖指正,感激不敬!先申明,小弟我入门仓促,很多东西也是一知半解,所以很多问题甚至是不求甚解,所以大神们就直接绕路算了. 总结一:3D max+blend+WPF综合运用 开发环境: Autodesk 3ds Max Design 2012 Micosoft Expression Blend 4 , Microsoft

转载 [WPF][C#]在WPF中内嵌WindowsForm控件-使用WindowsFormsControlLibrary

[WPF][C#]在WPF中内嵌WindowsForm控件-使用WindowsFormsControlLibrary 在[WPF][C#]在WPF中内嵌WindowsForm控件一文中为各位介绍了直接在WPF中使用XAML来嵌入Windows Form控件的作法,不过不是每个人都喜欢写XAML,而且有时候会需要把已经存在的Windows Form应用程序嵌入到WPF中,所以这次就来跟大家介绍怎么使用参考dll档的方式,把dll中的Windows Form加到WPF中. 都说了要使用Windows

Stimulsoft Reports.Wpf是针对WPF开发的报表工具控件

Stimulsoft Reports.Wpf是针对WPF开发的报表工具控件.无需上网,所有的WPF功能都能用上!丰富的界面更换功能.查看功能.打印以及导出报表功能——所有的这一切就是它都能轻松实现. 创建Stimulsoft Reports.Wpf是基于Stimulsoft团队多年开发以及使用的报表引擎来创建报表.只需简单的几行代码即可执行报表复杂的操作,报表引擎提供了创建报表的许多功能.大量的组件开发包,独特的一套属性和参数,精心构思的报表体系.很多选项都是绝对独特且仅出现该产品中.Stimu

WPF 精修篇 WPF嵌入Winfrom控件

原文:WPF 精修篇 WPF嵌入Winfrom控件 先增加DLL 支持 使用  WindowsFormsHost 来加载Forms的控件 引用命名空间 xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" <WindowsFormsHost Grid.Column="1"> <forms:PropertyGrid x:Name="Pro

Introduction to WPF Templates(WPF模板简介)

Introduction(简介) Windows Presentation Foundation allows the developer to completely change the look and feel of the controls. This is accomplished by using Control Templates. It means you can render your Button as an Ellipse which when hovered will c

[WPF] 我的WPF自学日记2,自定义入口

在winform中入口文件就是Program.cs,而在WPF中看不到,因为它是自动生成的,可以说隐藏了,我们可以自定义一个入口文件,然后修改项目属性中的启动对象为我们自定义的入口文件. 首先新建入口文件,名字随意. 代码如下: 1 [STAThread] 2 static void Main(string[] args) 3 { 4 if (args.Length > 0) 5 { 6 App app = new App(); 7 app.Run(new MainWindow(args[0].

wpf引用外部样式--------WPF

首先建一个 资源词典文件,名字叫sssss.xaml,我在里面写了几个样式...样式里也用到了触发器.每个资源标签都有一个key..引用的时候需要 然后在窗体里面xaml中引用 <Window x:Class="WPF_Tetst.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft

15个WPF项目例子+WPF经典开发教程0

摘要:有人推崇产品,有人推崇运营,也有人推崇战略-到底该推崇什么?李智勇系统地分析了这三者之间的思路,并引用黑格尔的一句话,给出了自己的看法:在尺度中已经蕴含本质,这在产品.运营.战略的侧重上体现的非常好. 视野不拉升或者认知不深入时,就容易在盲人摸象层面上反复,看到微信火了,那就产品最重要,看到阿里火了,那就平台最重要.实际上一个比较显然的事实是,没有锥子一样的产品,那你就火不起来:不能从产品升级为平台,那就很可能活不下去.当然,有些人会说平台也是一种产品,但就和人与猴子都是灵长目,实际上仍是