原文:WPF 3D模型的一个扩展方法

在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色。

先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过材质进行渲染(DiffuseMaterial) 。

这是一个ModelVisual3D的xaml代码:

                <ModelVisual3D x:Name="d18">                    <ModelVisual3D.Content>                        <GeometryModel3D x:Name="DefaultMaterial" d:Bounds="-156.412704467773,-34.2943992614746,-13.5738000869751,84.2265014648438,42.2536993026733,27.1476001739502">                            <GeometryModel3D.Geometry>                                <MeshGeometry3D Normals="0,-1,0 0,-1,0 0,-1,0 0,-1,0 0,1,0 0,1,0 0,1,0 0,1,0 0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,-1,, ,..."/>                            </GeometryModel3D.Geometry>                            <GeometryModel3D.Material>                                <DiffuseMaterial Brush="White"/>                            </GeometryModel3D.Material>                        </GeometryModel3D>                    </ModelVisual3D.Content>

层级结构是ModelVisual3D->ModelVisual3D.Content->GeometryModel3D->GeometryModel3D.Material

其中GeometryModel3D的Gemetry就定义了所有的坐标,将这些坐标连起来就是这个模型块的骨骼;Material就定义了这个骨骼的皮肤。

更多的解释去看msdn吧,我这里写了个通用方法修改模型的颜色:

public static class RenderExtension{        public static void SetColor(this ModelVisual3D visual3D, Brush color)        {            GeometryModel3D geometrymodel = visual3D.Content as GeometryModel3D;            if (geometrymodel.Material is MaterialGroup)            {                var materialGroup = geometrymodel.Material as MaterialGroup;                foreach (var groupItem in materialGroup.Children)                {                    if (groupItem is DiffuseMaterial)                    {                        DiffuseMaterial tmpItem = groupItem as DiffuseMaterial;                        tmpItem.Brush = color;                    }                }            }            else            {                DiffuseMaterial material = geometrymodel.Material as DiffuseMaterial;                if (material != null)                {                    material.Brush = color;                }            }        }} 

调用的时候只要写:visual3D.SetColor(Brushes.Red);就可以了

WPF 3D模型的一个扩展方法的更多相关文章

  1. WPF 3D 模型旋转

    原文:WPF 3D 模型旋转 WPF 是 Microsoft 在 Framework3.0 中支持的一种技术,它能作出很绚丽的界面,同时它也支持3D的操作.在3D操作主要包括平移(Translate) ...

  2. Chem 3D模型的参数值更改方法

    在化学绘图软件ChemOffice 15.1中有个专门用于绘制三维结构的组件,就是Chem 3D.通过这个组件用户可以绘制3D模型并可以通过这个组件来计算一些化学数据.在使用Chem 3D组件过程中, ...

  3. WPF 3D模型 3D场景

    1.首先得说明的是这并不是真正的3D,模型被导出为一系列的单个图片,例如一个3D户型图,以某个视角旋转360°,渲染出一系列连续的单个图片文件. 2.在Image.MouseMove事件中添加相应代码 ...

  4. Unity导入3D模型的过程与方法

    一.介绍 资源是游戏开发中的原材料,也就是组成游戏的模块. Unity只是一个游戏开发引擎,而并不是一个资源开发软件.这就意味着在游戏中需要的资源通常是由一些设计者使用其他软件开发出来的,然后设计者会 ...

  5. 关于PCB 3D 模型的快速导入方法

    altium designer中创建的3D library 只能查看3D效果,并没有其他功能,经测试在原理图编辑界面通过给元件添加 PCB 3D 并不能真正添加3D模型,这样添加根本没有效果(显示不出 ...

  6. MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便

    先看一下我想要的结果: 很容易它就是一个单选按钮组,当我后台为Html对象(HtmlHelper的一个实例,它被定义在System.Web.Mvc名称空间下的WebViewPage类,即它对于所有MV ...

  7. 给string定义一个扩展方法

    创建一个 static 的类,并且里面的方法也必须是static的,第一个参数是被扩展的对象,必须标注为this,使用时,必须保证namespace using进来了. 实例: using Syste ...

  8. MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集(转)

    namespace Entity { public interface IPagedList { /// <summary> /// 记录数 /// </summary> in ...

  9. Mvc分页:为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集

    namespace Entity{ public interface IPagedList { /// <summary> /// 记录数 /// </summary> int ...

随机推荐

  1. 通过WPF中UserControl内的按钮点击关闭父窗体

    原文:通过WPF中UserControl内的按钮点击关闭父窗体 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article ...

  2. 【Codeforces Round #185 (Div. 2) B】Archer

    [链接] 链接 [题意] 在这里输入题意 [题解] 概率水题. 枚举它是第几轮成功的. 直到满足精度就好 [错的次数] 1 [反思] long double最让人安心. [代码] #include & ...

  3. php实现 称砝码(背包)

    php实现 称砝码(背包) 一.总结 一句话总结: 1.dp的实质是什么? 刷表啊,用空间换时间 把表画出来会做得更快 13 //动态规划就是一个表 14 //至于这个表的更新就是上面层的表更新下面层 ...

  4. 终端中经常使用的shell 命令

    Mac 在shell命令终端中,Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键. 在命令终端中通过它们或者方向键能够实现对历史命令的高速查找.这也是高速输入命令的技巧. 在命令 ...

  5. 【Heritrix基础教程之2】Heritrix基本内容介绍 分类: B1_JAVA H3_NUTCH 2014-06-01 13:02 878人阅读 评论(0) 收藏

    1.版本说明 (1)最新版本:3.3.0 (2)最新release版本:3.2.0 (3)重要历史版本:1.14.4 3.1.0及之前的版本:http://sourceforge.net/projec ...

  6. js进阶 11-21 纯css实现选项卡

    js进阶 11-21 纯css实现选项卡 一.总结 一句话总结:核心原理,a标签的锚点效果+父div限宽+多的部分隐藏. 1.如何实现a标签的锚点效果? href属性找到对应的位置就好,和选择器一样, ...

  7. php实现找链表中环的入口节点(画图、看评论)

    php实现找链表中环的入口节点(画图.看评论) 一.总结 画图.看评论 二.php实现找链表中环的入口节点 题目描述: 一个链表中包含环,请找出该链表的环的入口结点. 三.代码 第一步,找环中相汇点. ...

  8. 打开cad文件的几种方法

    转自原文 打开cad文件的几种方法 IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeature ...

  9. [React] Update Component State in React With Ramda Lenses

    In this lesson, we'll refactor a React component to use Ramda lenses to update our component state. ...

  10. [Angular Testing] Unit Testing -- Test component and service.

    Recommend to use angular-cli to generate component and service, so we can get testing templates. ng ...