博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF 3D模型的一个扩展方法
阅读量:7122 次
发布时间:2019-06-28

本文共 1512 字,大约阅读时间需要 5 分钟。

原文:

在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);就可以了

 

转载地址:http://vkael.baihongyu.com/

你可能感兴趣的文章
2017-07-15 前端日报
查看>>
Android布局优化:ViewStub标签实现延迟加载(源码解析原理)
查看>>
Webpack快速入门
查看>>
HandlerThread与AsyncQueryHandler源码分析
查看>>
caffe原理之softmax函数
查看>>
数据分组统计
查看>>
记录fastclick中一次手动触发click事件失败
查看>>
云框架发布KONG API Gateway主题,开源求助攻~
查看>>
从一次报错聊聊 Point 事件
查看>>
JS attribute and prpperty
查看>>
SpringMVC配置太多?试试SpringBoot
查看>>
详解js深浅复制
查看>>
Laravel 服务容器实现原理
查看>>
stl map
查看>>
什么是with?
查看>>
LeetCode Weekly Contest 21
查看>>
查询计划参数详解
查看>>
JS中把对象赋值给变量时出现的问题
查看>>
华为敏捷/DevOps实践:如何开好迭代计划会议
查看>>
AI+社交,快手商业化落地之道
查看>>