原文 WPF 3D:MeshGeometry3D的定义和光照

由于WPF计算光照会根据整个平面的方向向量,所以如果在不同面上使用同一个点可能会达到不同的光照效果。让我们用不同的定义Mesh的方法来演示这个问题。

首先要定义两个简单的相交面,为方便定义,整个图形的主视图可以参考下图:

第一个方法就是用最简单的最笨的方法,一次性定义所有的点,这样两个面四个三角形一共12个点,TriangleIndices是从0到11.

如下代码:

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

结果:

我们得到了想要的效果。

上面讲过“由于WPF计算光照会根据整个平面的方向向量,所以如果在不同面上使用同一个点可能会达到不同的光照效果”,那么下一种方法,两个面总共6个点,我们只定义这6个点,在TriangleIndices中重复利用看看结果,代码:

<MeshGeometry3D Positions="-1 1 0, 0 1 1, 1 1 0, -1 0 0, 0 0 1, 1 0 0"
TriangleIndices="3 1 0, 3 4 1, 4 2 1, 4 5 2"/>

结果:

并没有得到严格意义上正确的光照(使用DirectionalLight),由于顶点被重复利用,同一平面的光照会被不同顶点混合而成了上面的效果。

最后,最合适的办法就是不在不同面上重复利用顶点,但在相同面上可以重复利用。这样两个面每个面固定4个点一共8个点(介于方法一12个点和方法二6个点之间)。

这样定义:

<MeshGeometry3D Positions="-1 1 0, 0 1 1, -1 0 0, 0 0 1, 0 1 1, 1 1 0, 0 0 1, 1 0 0"
TriangleIndices="2 1 0, 2 3 1, 6 5 4, 6 7 5"/>

可以达到和方法一同样的正确光照,同时定义更少的点。

全部代码:

<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="0 0.5 3" LookDirection="0 0 -1"/>
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<DirectionalLight Direction="1 0 -2"
Color="White"/>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1 1 0, 0 1 1, -1 0 0, 0 0 1, 0 1 1, 1 1 0, 0 0 1, 1 0 0"
TriangleIndices="2 1 0, 2 3 1, 6 5 4, 6 7 5"/>
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Green"/>
</GeometryModel3D.Material>
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>

WPF 3D:MeshGeometry3D的定义和光照的更多相关文章

  1. WPF 3D: MeshGeometry3D纹理坐标的正确定义

    原文 WPF 3D: MeshGeometry3D纹理坐标的正确定义 为了使基于2D的纹理显示在3D对象中,我们必须定义3D Mesh对象的纹理贴图坐标.在WPF中,此项功能则通过MeshGeomet ...

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

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

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

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

  4. WPF 3D 常用类(1)

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

  5. WPF 3D:使用GeometryModel3D的BackMaterial

    原文 WPF 3D:使用GeometryModel3D的BackMaterial 使用BackMaterial,我们可以定义3D物体的内部材质(或者说是背面),比如,我们定义一个四方体容器,外面现实的 ...

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

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

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

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

  8. WPF 3D编程介绍

    原文:WPF 3D编程介绍 上一篇文章简单的介绍了WPF编程的相关的内容,也推荐了本书.今天要来讲一下在WPF如何开展3D编程. 使用的xmal 和C#开发的时候:需要使用如下的关键要素: 1:摄像机 ...

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

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

随机推荐

  1. casio 手表北京维修网络

    http://www.casio.com.cn/support/service/wat/28.html 手表北京维修网络 号新东安广场2座11层1103室电话:010-65157818/8391585 ...

  2. CentOS IP丢失,切换了网络连接导致的vmnet8未启用dhcp

    解决了, 这个问题是我在开启虚拟机ubuntu系统的过程中, 在主机win7上切换了网络连接导致的, 就是刚开始我用的无线宽带上网, 此时开启了ubuntu ,然后使用过程中,我在win7上切换回静态 ...

  3. Function 详解(一)

    一直想写一系列关于javascript的东西,可惜从申请博客以来就一直抽不出时间来好好写上一番,今天终于熬到周末,是该好好整理一下,那么先从声明函数开始吧; 总所周知,在javascript中有匿名函 ...

  4. 旧发票要保留SIRET等信息,或者整个PDF

    查看旧发票时,每次都实时生成发票是不行的,因为公司的SIRET居然会是变的!!

  5. Theano+Keras+CUDA7.5+VS2013+Windows10x64配置

    Visual Studio 2013 正常安装,这里只要C++打勾就可以. ANACONDA ANACONDA是封装了Python的科学计算工具,装这个就可以不用额外装Python了.在安装之前建议先 ...

  6. JNI生成so

    软件:android-ndk-r8 推荐使用这个版本,可以直接不用安装Cygwin软件就可以编译. 然后在系统环境变量中path选项中添加安装路径,比如我的:C:\android-ndk-r8: 然后 ...

  7. [Android学习笔记]Canvas的使用

    Canvas文档 http://developer.android.com/training/index.html 在绘制view时候,重写onDraw(canvas)方法,可能需要在canvas上绘 ...

  8. Mybatis 3 返回布尔值,需要注意的地方

    在Mybatis中,有时候需要返回布尔值 ,来确定某个记录行是否存在. 例如: <select id="isExistCode" parameterType="st ...

  9. 44个JAVA代码质量管理工具(转)

    1. CodePro AnalytixIt’s a great tool (Eclipse plugin) for improving software quality. It has the nex ...

  10. javascript面向对象程序设计

    在学习js面向对象编程之前,首先须要知道什么是面向对象.面向对象语言都有类的概念,通过它能够创建具有同样属性和方法的对象.但js并没有类的概念,因此js中的对象和其它语言的对象有所不同. js对象能够 ...