WPF 3D动态加载模型文件
2016-12-05 15:33
423 查看
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();
转自:http://www.cnblogs.com/enjoyeclipse/archive/2012/03/21/2410439.html
相关文章推荐
- 详细探究Spark的shuffle实现
- 康奈尔大学的电影对白语料库介绍 --Cornell Movie-Dialogs Corpus
- 解决 RuntimeWarning: Parent module '...' not found while handling absolute import
- Another Array of Orz Pandas
- 《作业一》总结
- C# 线程池的使用
- hbase 0.98.9客户端的两个参数调优
- 五、Java 多线程 并发编程#
- Mysql常用30种SQL查询语句优化方法
- C++虚继承的概念
- 测试基础理论
- C++socket套接字编程以及模拟键鼠操作的总结
- RABBITMQ/JAVA 客户端测试(再补:利用文件流)
- spams----稀疏建模工具箱在MATLAB下的安装编译
- 四种Java线程池用法解析
- MySQL忘记root密码--skip-grant-tables
- Android笔记——AsyncTask介绍
- python游戏
- python 关于post和get的区别
- Linux http网络协议