原文: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动态加载模型文件的更多相关文章

  1. WPF中动态加载XAML中的控件

    原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...

  2. [CG从零开始] 3. 安装 pyassimp 库加载模型文件

    assimp 是一个开源的模型加载库,支持非常多的格式,还有许多语言的 binding,这里我们选用 assimp 的 python 的 binding 来加载模型文件.不过社区主要是在维护 assi ...

  3. Java_Java中动态加载jar文件和class文件

    转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...

  4. Android应用安全之外部动态加载DEX文件风险

    1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...

  5. js动态加载css文件和js文件的方法

    今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...

  6. 两种动态加载JavaScript文件的方法

    两种动态加载JavaScript文件的方法 第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看 ...

  7. QUiLoader 动态加载.ui文件

    动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui 文件.不用 uic工具把.ui 文件变成等价的 c++代码,而是在程序运行过程中需要用到UI文件时,用 QUiLoader ...

  8. 动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数

    动态加载JS文件,并根据JS文件的加载状态来执行自己的回调函数, 在很多场景下,我们需要在动态加载JS文件的时候,根据加载的状态来进行后续的操作,需要在JS加载成功后,执行另一方法,这个方法是依托在加 ...

  9. 详解QUiLoader 动态加载.ui文件

    http://blog.chinaunix.net/uid-13838881-id-3652523.html 1.适用情况: 动态加载UI文件是指,用 Qt Designer 通过拖拽的方式生产.ui ...

随机推荐

  1. get_slave_status.py

    #!/usr/bin/env python#-*- encoding: utf8 -*- import mysql.connectorimport get_mysql_conn_info    &qu ...

  2. [NIO]用dawn发送接收HTTP请求

    HTTP协议的下层使用的是tcp.所以我们建立一个tcp连接就能发送接收http请求.dawn底层使用了nio.可是经过dawn的封装之后,我们在编写代码的时候,就和使用普通的堵塞式socket一样 ...

  3. thinkphp 3.2,引入第三方类库的粗略记录

    首先用第三方类库我是放到vendor里面的 根目录\ThinkPHP\Library\Vendor\Wxphp 例如创建了一个Wxphp文件夹,里面有个php文件叫做     zll.php    文 ...

  4. COCOS2D-X 3.0在MAC下创建新IOS项目:

    首先进入:CocoStudio\Source\3.0\cocos2d-x\tools\cocos2d-console\bin 运行 ./cocos new -p com.aaaa -l cpp MyG ...

  5. Android多线程研究(7)——Java5中的线程并发库

    从这一篇开始我们将看看Java 5之后给我们添加的新的对线程操作的API,首先看看api文档: java.util.concurrent包含许多线程安全.测试良好.高性能的并发构建块,我们先看看ato ...

  6. php json字符串转为数组或对象

    从网上查到的方法是 用get_object_vars 把类类型转换成数组 然后在用foreach  遍历即可 $array = get_object_vars($test); $json= '[{&q ...

  7. PHP怎么读写XML?(四种方法)

    PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...

  8. PHP移动互联网开发笔记(7)——MySQL数据库基础回顾[1]

    一.数据类型 1.整型 数据类型 存储空间 说明 取值范围 TINYINT 1字节 非常小的整数 带符号值:-128~127无符号值:0~255 SMALLINT 2字节 较小的整数 带符号值:-32 ...

  9. kali 系统的源

    sources.list deb http://http.kali.org/kali kali-rolling main non-free contrib deb http://mirrors.ust ...

  10. 数据结构与算法——常用数据结构及其Java实现

    前言 仿佛一下子,2017年就快过去一半了,研一马上就要成为过去式了,我打算抓住研一的尾巴,好好梳理一下数据结构与算法,毕竟这些基础知识是很重要的嘛.所以准备在这里搞一个系列的文章,以期透彻. 本系列 ...