原文: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
0,0,1 0,..."/>
                            </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. Chem 3D模型的参数值更改方法

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

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

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

  3. WPF 3D模型介绍及使用

    2D 容器中的三维: WPF 中的3D 图形内容封装在一个元素中, Viewport3D 该元素可以参与二维元素结构. 在 WPF 中,图形系统将视为二维 Viewport3D 视觉对象,如许多其他元 ...

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

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

  5. 为JS和C#类加一个扩展方法吧:P

    JS扩展方法:通过原型prototype为JS的function扩展一个新的function <script> function Rectangle(width, height) { th ...

  6. MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedListT结果集

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

  7. 总结一下一般游戏中3D模型各种勾边方法遇到的工程性问题

    以前做过简单的rim light勾边,几何勾边,这次又做了后处理的勾边,工程化的时候,都遇到很多问题,简单总结一下. 首先是火炬之光勾边效果,类似轮廓光的实现,简单的卡通渲染也是通过类似的算法加采样色 ...

  8. 分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型

    这张图每位程序员应该都深有感触. 人民心目中的程序员是这样的:坐在电脑面前噼里啪啦敲着键盘,运键如飞. 现实中程序员是这样的:编码5分钟,调试两小时. 今天我要给大家分享一个用WebGL开发的网站,感 ...

  9. 2D图片转3D模型软件介绍

    原文http://protoduct.com/post/2012-09-28/40038833931 如果说3D打印是从虚拟到现实的桥梁,那么3D扫描就是那段回程.3D打印要想得到普及,普通消费者能够 ...

最新文章

  1. 马斯克脑洞破解谁是“中本聪”?
  2. 如何制作印章_电子公章怎么制作
  3. 阅读总结:如何在生产中成功运用Docker
  4. 云服务器ECS使用限制概览,让你的上云少走一些坑
  5. vscode-background插件“卸载“以及“禁用“失效
  6. web项目01-----项目需求分析,需求文档
  7. 干活,分享!!三套简单有趣的后台登录页面模板分享
  8. 苹果手机邮箱imap服务器没有响应,Apple手机的内置电子邮件地址突然显示imap.gmail.com没有响应,无法发送电子邮件...
  9. 解决win10没Wifi功能了,无线网卡驱动异常代码56的问题
  10. glm-0.9.9.7 + visual studio 2019 + window10下载安装
  11. 二线城市疯狂抢人,技术人才何去何从?
  12. 容器镜像仓库Harbor安装部署及简单使用
  13. 802.11ac linux驱动下载,下载的驱动程序Realtek 8811CU Wireless LAN 802.11ac USB NIC 1030.22.0405.2017...
  14. 万字长文读透 Redis
  15. 在设备树中时钟的简单使用
  16. 14.PG分区表-传统分区表
  17. 最新研究表明:熬夜会增加患癌症几率
  18. python:微信对话开放平台自定义API接口(基于腾讯云函数)
  19. ERROR: Failed to resolve: xxx Affected Modules: xxx
  20. 记录一款Unity VR视频播放器插件的开发

热门文章

  1. java.util.zip 用法,Java压缩文件工具类ZipUtil使用方法代码示例
  2. div添加一个点击事件(绑定点击事件)
  3. 学习 Linux LVM
  4. 博客文章加线框/表格
  5. 超详细深度学习debug指南,国外小哥手把手教你如何调试模型 | 附PPT
  6. GitHub发布年度机器学习榜:TensorFlow最火,PyTorch失踪,Julia第四
  7. 美国62%智能音箱用户都使用了语音购物,连鹦鹉都忍不住了
  8. 有钱了不起?!苹果猎头挖到马斯克没脾气,特斯拉股东公开求收购
  9. 专栏 | 是什么成就了中国最具创新力的公司,帮他们的超脑计划孵出阿尔法蛋?...
  10. 自动给神经网络找bug,Google发布TensorFuzz