WPF 3D:MeshGeometry3D的定义和光照

原文 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>
时间: 2024-08-02 04:52:11

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

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

原文 WPF 3D: MeshGeometry3D纹理坐标的正确定义 为了使基于2D的纹理显示在3D对象中,我们必须定义3D Mesh对象的纹理贴图坐标.在WPF中,此项功能则通过MeshGeometry3D.TextureCoordinates属性.   2D纹理的对应坐标和WPF的LinearGradientBrush的StartPoint和EndPoint一样. 下图来自MSDN关于LinearGradientBrush的StartPoint的说明:  (0,0)代表整个图形的左上角,(1

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

原文:WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体 运行结果:   事实上很简单,定义好一个正方体,处理好纹理.关于MeshGeometry3D的正确定义和纹理这里就不多讲了,可以参考我以前写过的一些文章: WPF 3D: MeshGeometry3D纹理坐标的正确定义 WPF 3D:MeshGeometry3D的定义和光照   接下来就是怎样让它动起来.我们通过3D点动画来改变照相机(Camera类型)的位置(Position属性)从而使正方体动起来(这样的话实

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

原文:WPF 3D 知识点大全以及实例 引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当然还有体感游戏等等.   3D 用来增加视觉效果,给人以更加直观,真实的感觉. 3D如此美妙,那我们在WPF中又该从何处入手开启我们的3D编程旅程?   WPF中3D开发技术的基础知识应该有以下几点: 3D开发基础知识 WPF中3D开发的基础元素(Elemen

WPF 3D 常用类(1)

原文:WPF 3D 常用类(1) 几何数据相关类 Geometry3D 抽象类, 用于定义物体的几何数据, 可用于计算HitTest和BoundingBox   MeshGeometry3D Geometry3D的子类, 定义网格的顶点, 三角形顶点, 法线, Texture(纹理)的座标 常用属性: Positions, TriangleIndices, Noramls, TextureCoordinates   模型相关类 (模型=几何数据+变形(位置,旋转,尺寸)+材质) Model3D

WPF 3D:使用GeometryModel3D的BackMaterial

原文 WPF 3D:使用GeometryModel3D的BackMaterial 使用BackMaterial,我们可以定义3D物体的内部材质(或者说是背面),比如,我们定义一个四方体容器,外面现实的是普通材质,里面的则是内部材质.比如下图,红色的是内部材质:   GeometryModel3D.BackMaterial默认是null,所以如果不定义他的话,背面的材质是不会显示,上面的程序则会运行成这样:   定义材质很简单,设置GeometryModel3D.Material属性和BackMa

WPF 3D:使用变换中的TranslateTransform3D

原文:WPF 3D:使用变换中的TranslateTransform3D 程序效果:   WPF 3D中的TranslateTransform3D应该是所有3D变换中最简单的变换,使用起来非常简单,先定义好3D对象,接着在适当的位置加入变换就可以了.   当然WPF 3D中变换(Transform3D类型)可以应用在如下属性中: 照相机:Camera类型 3D模型定义:Model3D类型 容纳3D模型的Visual3D:ModelVisual3D类型   对于2D的TranslateTransf

WPF 3D 小小小小引擎 - &amp;#183;WPF 3D变换应用

原文:WPF 3D 小小小小引擎 - ·WPF 3D变换应用         WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开发效率高,而且也容易上手.         下面给大家演示的是使用在WPF 3D上实现视角变换,通过鼠标拖动来变换观察视角,通过滚轮来放缩视距. 有关3D的基础知识可以参考MSDN文档:三维图形概述             首先创建一个3D立方体,立方体是由六个面构成(F1, F2

WPF 3D问题

问题描述 怎么设置摄像机位置,让3D对象在Viewport3D中占用大约80%的空间假设:FieldOfView=60;UpDirection=0,1,0;LookDirection=0,0,1; 解决方案 解决方案二:来个人啊解决方案三:这个需要设置它的Position属性吧解决方案四:引用2楼duanzi_peng的回复: 这个需要设置它的Position属性吧 是的,我现在就想知道导入一个obj文件后,需要将Position设置为多少才能让Obj占用Vieport3D大约80%的大小解决方

wpf 3d

问题描述 各位大侠你们好,本人正在学wpf,现在想做个一组图片绕中心体转动的效果,鼠标经过与单击图片时有事件触发,主要是那个绕物体转动的效果弄不来,用户看到的转动是从侧面看的,是椭圆形的,图片要有远近效果,请各位高手指点指点,感谢大家.或是推荐一些这方面的资料也不错哦!我之前看过用flash做过的类似效果,想问一下,wpf和flash做图片动画哪个比较省事啊. 解决方案 解决方案二:是这个吗?解决方案三:谢谢,这个效果不错,但是我想要的是像地球绕太阳转的效果,从侧门的角度看是个椭圆轨迹.解决方案