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

本文介绍了一种在WPF3D中修改ModelVisual3D对象颜色的通用方法,通过调整DiffuseMaterial的Brush属性实现。适用于需要改变3D模型外观的应用场景。
原文: 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);就可以了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值