WPF 3D模型的一个扩展方法
2012-02-23 19:26
381 查看
在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);就可以了
先说说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中多个模型如何设置某一个在最前?
- 一个linux典型的select模型更新方法
- 编写js扩展方法判断一个数组中是否包含某个元素
- 一个利用扩展方法的实例:AttachDataExtensions (改良老赵方法)
- wpf动态加载obj格式的3D模型
- 一个利用扩展方法的实例:AttachDataExtensions
- EF sql 查询返回dynamic 扩展一个方法
- Mysql主从一个常见问题及解决“模型(方法)”
- HTML5导入*.skp *.kmz模型的方法,类似sketchup,利用HTML5的3D性能将模型显示出来,请教一下,怎么弄啊
- 给 string 增加一个 GetInputStream 扩展方法
- 使用 MSIL 为 Enum.HasFlag 封装一个泛型的扩展方法
- 写一个针对IQueryable<T>的扩展方法支持动态排序
- 一个利用扩展方法的实例:AttachDataExtensions 转自 博客园 JeffreyZha
- IQueryable定义一个扩展方法。分页
- 给 Javascript 的 日期(Date)对象扩展一个格式化(format)方法
- Yii 表模型类具备的方法的一个例子(必须+可选)
- 一个通用的DataGridView导出Excel扩展方法(支持列数据格式化)
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- 编写js扩展方法实现判断一个数组中是否包含某个元素
- 建立一个对象模型的时候,为什么要重写hashCode与equals方法