WPF 3D动态加载模型文件
这篇文章需要读者对WPF 3D有一个基本了解,至少看过官方的MSDN例子。
一般来说关于WPF使用3D的例子,都是下面的流程:
1.美工用3DMAX做好模型,生成一个obj文件
2.程序然后打开Blender,将obj拖动到Blender中,生成xaml代码
但是这样做会有至少两个问题:
1. 维护麻烦,因为一旦模型修改,你需要重复上面的步骤,至少要修改xaml的代码。
2. 只能使用原生的ModelVisual3D,这会导致模型扩展的困难,具体见这篇文章。
所以最好还是动态读取obj文件,我这里使用的是一个网上别人写的WavefrontObjLoader。
代码比较复杂,基本思路就是打开文件,解析obj格式,生成ModelVisual3D。
/Files/enjoyeclipse/WavefrontObjLoader.zip
类的入口是下面这个方法,传入文件名 xxx.obj, 返回一个ModelVisual3D。
public ModelVisual3DWithName LoadObjFile(string targetFile)
但是我对源文件进行了些修改,一个是满足我的业务需要,一个是修正了一个bug:
1.将ModelVisual3D改成了ModelVisual3DWithName,这样我就可以在解析obj文件之后,给ModelVisual3D加上Name和Tag了,方便维护。(原生的ModelVisual3D是没有的,非常麻烦)。同时有一个private Dictionary<string, ModelVisual3DWithName> dictionaries方便根据名字查找其中的某个模型。
[ContentProperty("Children")]
public class ModelVisual3DWithName : ModelVisual3D { public string Name { get; set; } public object Tag { get; set; } }
2. 原来的代码第150行是没有clone的,直接赋值=,这样会导致模型的一个部分材质变了,其他的也跟着变。
modeld.Material = geometry.Material.Clone();
WPF 3D动态加载模型文件的更多相关文章
- WPF中动态加载XAML中的控件
原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...
- [CG从零开始] 3. 安装 pyassimp 库加载模型文件
assimp 是一个开源的模型加载库,支持非常多的格式,还有许多语言的 binding,这里我们选用 assimp 的 python 的 binding 来加载模型文件.不过社区主要是在维护 assi ...
- Java_Java中动态加载jar文件和class文件
转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- Android应用安全之外部动态加载DEX文件风险
1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...
- js动态加载css文件和js文件的方法
今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...
- 两种动态加载JavaScript文件的方法
两种动态加载JavaScript文件的方法 第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看 ...
- QUiLoader 动态加载.ui文件
动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui 文件.不用 uic工具把.ui 文件变成等价的 c++代码,而是在程序运行过程中需要用到UI文件时,用 QUiLoader ...
- 动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数
动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数, 在很多场景下,我们需要在动态加载JS文件的时候,根据加载的状态来进行后续的操作,需要在JS加载成功后,执行另一方法,这个方法是依托在加 ...
- 详解QUiLoader 动态加载.ui文件
http://blog.chinaunix.net/uid-13838881-id-3652523.html 1.适用情况: 动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui ...
随机推荐
- WPF应用程序启动的问题(自定义Main函数启动)
问题引入: 一般WPF创建之后可以直接运行并不需要编写Main函数指定入口,但是在开发的过程中会遇到一些情况需要自定义Main让WPF从指定的Main函数中进行启动,这样可能会更好控制一点.但是我们再 ...
- C++基础学习教程(七)----类编写及类的两个特性解析--->多态&继承
类引入 到眼下为止我们所写的自己定义类型都是keywordstruct,从如今起我们将採用class方式定义类,这样的方式对于学习过其它高级语言包含脚本(Such as Python)的人来说再熟悉只 ...
- pstack.sh 查看进程堆栈
#!/bin/bash if (( $# < 1 )) then echo "usage: `basename $0` pid" 1>&2 ex ...
- UE4的JSON读写方式<一>
声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/41009343 UE4的Json的解析博客地址: http:// ...
- mysql zip文件安装
bin目录下执行mysqld -install再执行mysqld --initialize-insecure 启动服务:net start mysql
- expdp之后scp的惊险时刻
今天在导出数据的时候.忽然就想起了上次导数据的惊险时刻. 当时导出数据,有40g.分盘./backup有几T的空间,非常easy.果断搞! 是daochu.dmp,导出后传到还有一个主机,还有一个主机 ...
- OSGI简介—HelloWorld
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wanghuan203/article/details/13631713 本次介绍的 HelloWor ...
- 理解Erlang/OTP Supervisor
http://www.cnblogs.com/me-sa/archive/2012/01/10/erlang0030.html Supervisors are used to build an hie ...
- SecondaryNameNode 的作用
Secondary NameNode:它究竟有什么作用? 尽量不要将 secondarynamede 和 namenode 放在同一台机器上. 1. NameNode NameNode 主要是用来保存 ...
- 学习鸟哥的Linux私房菜笔记(3)——基础使用
一.设备文件 设备在Linux中以特殊文件的形式存在 块(block)设备文件 字符(character)设备文件 设备文件所在位置 查看设备类型 二.虚拟控制台及用户身份切换 在系统中有12个虚拟控 ...