原文 WPF 3D:使用GeometryModel3D的BackMaterial

使用BackMaterial,我们可以定义3D物体的内部材质(或者说是背面),比如,我们定义一个四方体容器,外面现实的是普通材质,里面的则是内部材质。比如下图,红色的是内部材质:

GeometryModel3D.BackMaterial默认是null,所以如果不定义他的话,背面的材质是不会显示,上面的程序则会运行成这样:

定义材质很简单,设置GeometryModel3D.Material属性和BackMaterial,放置任何一个继承与Material类型的对象,这里就以最普通的DiffuseMaterial做示范:

  1. <GeometryModel3D.Material>
    <DiffuseMaterial Brush="Green"/>
    </GeometryModel3D.Material>
    <GeometryModel3D.BackMaterial>
    <DiffuseMaterial Brush="Red"/>
    </GeometryModel3D.BackMaterial>

很简单,难点则在于怎样正确定义。

WPF MeshGeometry3D中,逆时针定义的三角形代表着正面,也就是说会被Material属性填充,而他的背面会被BackMaterial填充。上面中的3D图形是4个面,每个面4个点,这样一共16个点,分别将外面的面中的三角形逆时针定义。注意要在立体空间内将每个对外的面的三角形都逆时针定义或许考验你的空间想象力,做个简单的演示图如下:

这样的话,先在Positions中定义的所有点,然后根据三角形的定义方向再定义TriangleIndices就可以了。代码:

  1. <MeshGeometry3D Positions="-1 1 1, 1 1 1, -1 -1 1, 1 -1 1, -1 1 -1, 1 1 -1, -1 -1 -1, 1 -1 -1
    1 1 1, 1 1 -1, 1 -1 1, 1 -1 -1, -1 1 1, -1 1 -1, -1 -1 1, -1 -1 -1"
    TriangleIndices="0 2 1, 1 2 3, 5 6 4, 5 7 6
    8 10 9, 9 10 11, 13 14 12, 13 15 14"/>

这样就得到了上面的3D图形(文章下面有完整的XAML代码)。

如果我们把一个三角形改成顺时针定义的,比如第一个点,把TriangleIndices中的逆时针定义的0 2 1点改成1 2 0。第一个三角形则会被填充成BackMaterial,结果成了下图:

完整的代码:

  1. <Viewport3D>
    <Viewport3D.Camera>
    <PerspectiveCamera Position="-2.5 2.5 5" LookDirection="0.5 -0.5 -1"/>
    </Viewport3D.Camera>
    <ModelVisual3D>
    <ModelVisual3D.Content>
    <Model3DGroup>
    <DirectionalLight Direction="1 0 -7"
    Color="White"/>
    <GeometryModel3D>
    <GeometryModel3D.Geometry>
    <MeshGeometry3D Positions="-1 1 1, 1 1 1, -1 -1 1, 1 -1 1, -1 1 -1, 1 1 -1, -1 -1 -1, 1 -1 -1
    1 1 1, 1 1 -1, 1 -1 1, 1 -1 -1, -1 1 1, -1 1 -1, -1 -1 1, -1 -1 -1"
    TriangleIndices="0 2 1, 1 2 3, 5 6 4, 5 7 6
    8 10 9, 9 10 11, 13 14 12, 13 15 14"/>
    </GeometryModel3D.Geometry>
    <GeometryModel3D.Material>
    <DiffuseMaterial Brush="Green"/>
    </GeometryModel3D.Material>
    <GeometryModel3D.BackMaterial>
    <DiffuseMaterial Brush="Red"/>
    </GeometryModel3D.BackMaterial>
    </GeometryModel3D>
    </Model3DGroup>
    </ModelVisual3D.Content>
    </ModelVisual3D>
    </Viewport3D>

WPF 3D:使用GeometryModel3D的BackMaterial的更多相关文章

  1. WPF 3D 知识点大全以及实例

    引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...

  2. 优化WPF 3D性能

    Maximize WPF 3D Performance .NET Framework 4.5   As you use the Windows Presentation Foundation (WPF ...

  3. WPF 3D:使用变换中的TranslateTransform3D

    原文:WPF 3D:使用变换中的TranslateTransform3D 程序效果: WPF 3D中的TranslateTransform3D应该是所有3D变换中最简单的变换,使用起来非常简单,先定义 ...

  4. WPF 3D model - Sphere, Cone, and Cylinder

    原文:WPF 3D model - Sphere, Cone, and Cylinder   Extending Visual3D - Sphere, Cone, and Cylinder http: ...

  5. WPF 3D 获取鼠标在场景的3d坐标

    原文:WPF 3D 获取鼠标在场景的3d坐标 上一篇中我们谈到了WPF 3d做图的一些简单原理,这里我们简单介绍一下怎样获得鼠标在场景中的3d坐标,知道了3d坐标就可以进行很多操作了: 首先介绍一下3 ...

  6. WPF 3D 小小小小引擎 - ·WPF 3D变换应用

    原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用 WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开 ...

  7. WPF 3D 常用类(1)

    原文:WPF 3D 常用类(1) 几何数据相关类 Geometry3D 抽象类, 用于定义物体的几何数据, 可用于计算HitTest和BoundingBox MeshGeometry3D Geomet ...

  8. WPF 3D:MeshGeometry3D的定义和光照

    原文 WPF 3D:MeshGeometry3D的定义和光照 由于WPF计算光照会根据整个平面的方向向量,所以如果在不同面上使用同一个点可能会达到不同的光照效果.让我们用不同的定义Mesh的方法来演示 ...

  9. WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体

    原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果: 事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲 ...

随机推荐

  1. [Android学习笔记]Android调试

    Eclipse Debug 快捷键: [Ctrl + Shift + B]: 添加/取消断点 [F5]:进入方法中 [F6]:单步执行 [F7]:执行完毕此方法 [F8]:继续执行,直接跳到下一个断点 ...

  2. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  3. YII 实现布局

    布局文件: <div>我是头部</div> <!--展示首页.登录.注冊等代码信息--> <!--$content代表我们已经提取出来的首页.登录.注冊等页面 ...

  4. uva live-2322 - Wooden Sticks

    首先排个序,然后找一次0花费,然后再找一次0花费,然后再找一次0花费,然后再找一次0花费......... 最后看找了几次,+1就是答案 #include<iostream> #inclu ...

  5. vim经常使用命令总结

    vim 选择文本,删除,复制,粘贴   文本的选择,对于编辑器来说,是非常主要的东西,也常常被用到,总结例如以下: v    从光标当前位置開始,光标所经过的地方会被选中,再按一下v结束. V     ...

  6. VSTO 为Office已有右键菜单添加自己的菜单项(word,Excel)

    原文:VSTO 为Office已有右键菜单添加自己的菜单项(word,Excel) private void AddRightMenu()         {            Microsoft ...

  7. Java程序猿面试题集(181- 199)

    Java面试题集(181-199) 摘要:这部分是包括了Java高级玩法的一些专题,对面试者和新入职的Java程序猿相信都会有帮助的. 181.  182. 183. 184. 185. 186. 1 ...

  8. 无状态TCP的ip_conntrack

    Linux的ip_conntrack实现得过于沉重和精细.而实际上有时候,根本不需要在conntrack中对TCP的状态进行跟踪,只把它当UDP好了,我们的需求就是让系统可以将一个数据包和一个五元组标 ...

  9. poj2245Lotto(最基础的dfs)

    题目链接: 啊哈哈,点我点我 思路:最開始画好搜索状态,然后找好结束条件,最好预推断当前找到的个数和能够找到的是否大于6就可以.. 题目: Lotto Time Limit: 1000MS   Mem ...

  10. sql优化-提防错误关联

    在写sql时,在多表关联时,有时候容易把关联关系写错.一般情况下,该问题比较容易发现,但如果sql较长时,光靠眼力就比较难发现了.今天写了一个脚本,碰到该问题了. 第一版本的脚本如下: select ...