WPF之3D基础
二维与三维空间对比
WPF的3D空间形成原理
在3D动画中,要画一个3D模型,必须要有
1、照相机
照相机
了解三维场景如何在二维图面上表示的另一种方法就是将场景描述为到观察表面上的投影。
有两种Camera:
1、ProjectionCamera
2、OrthographicCamera
使用 ProjectionCamera,可以指定不同的投影及其属性以更改观察者查看三维模型的方式。 PerspectiveCamera 指定用来对场景进行透视收缩的投影。
ProjectionCamera 的 NearPlaneDistance 和 FarPlaneDistance 属性限制照相机的投影范围。
OrthographicCamera 指定三维模型到二维可视化图面上的正投影。
光源
与实际的光一样,三维图形中的光能够使图面可见。更确切地说,光确定了场景的哪个部分将包括在投影中。
WPF 中的光对象创建了各种光和阴影效果,而且是按照各种实际光的行为建模的。
您必须至少在场景中包括一个光,否则模型将不可见。
∙AmbientLight:它所提供的环境光以一致的方式照亮所有的对象,而与对象的位置或方向无关。
∙DirectionalLight:像远处的光源那样照亮。 将方向光的 Direction 指定为 Vector3D,但是没有为方向光指定位置。
∙PointLight:像近处的光源那样照亮。 PointLight 具有一个位置并从该位置投射光。
场景中的对象是根据对象相对于光源的位置和距离而被照亮的。PointLightBase 公开 Range 属性,该属性确定一个距离,
超过该距离后模型将无法由光源照亮。 PointLight 还公开了多个衰减属性,这些属性确定
光源的亮度如何随距离的增加而减小。
您可以为光源的衰减指定恒定、线性或二次内插算法。
∙SpotLight:从 PointLight 继承。 Spotlight 的照亮方式与 PointLight 类似,但是它既具有位置又具有方向。
它们在 InnerConeAngle 和OuterConeAngle 属性所设置的锥形区域(以度为单位指定)中投射光。 讨论法
光源是 Model3D 对象,因此您可以转换光源对象并对光源属性(包括位置、颜、方向和范围)进行动画处理。
使用3D Tools构建3D坐标系
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="-2,2,2" LookDirection="2,-2,-2" UpDirection="0,1,0"/>
</Viewport3D.Camera>
<tools:ScreenSpaceLines3D Points="-10,0,0 10,0,0" Thickness="1" Color="Red"></tools:ScreenSpaceLines3D>
<tools:ScreenSpaceLines3D Points="0,-10,0 0,10,0" Thickness="1" Color="Blue"></tools:ScreenSpaceLines3D>
荒诞
大庆油田教育中心<tools:ScreenSpaceLines3D Points="0,0,-10 0,0,10" Thickness="1" Color="Green"></tools:ScreenSpaceLines3D>
</Viewport3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="1,0,0 0,-1,0 0,0,1"/>
</GeometryModel3D.Geometry>
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Yellow" />
</GeometryModel3D.Material>
</GeometryModel3D>
陕西理工大学魏乐 </ModelVisual3D.Content>
</ModelVisual3D>
这里介绍MeshGeometry的属性
Positions表示三维坐标系顶点坐标,以空格为间隔.那么这三个坐标则为
1.1,0,0(红线右正)
宝马z92.0,-1,0(蓝线上正)
3.0,0,1(绿线右正)
效果如下
画多个三角形
坐标点必须是3的倍数,如下
<MeshGeometry3D Positions="
1,0,0 0,-1,0 0,0,1
-1,0,0 0,0,0 0,1,0
-1.5,0,0 0,-1.5,0 0,-0.5,0"/>
坐标索引(TriangleIndices)
默认情况下画三角形,以第0个坐标点为索引值.
TriangleIndices可以让我们改变画三角形坐标点的索引值,比如4个坐标点,本来是0,1,2,第4个坐标点将无效,这里可以将坐标点看做储备坐标,用每3个坐标点拼凑三角形
如画出上面3个三角形的其中一个,那么索引就是3,4,5(从0开始)
<MeshGeometry3D Positions="
1,0,0 0,-1,0 0,0,1
-1,0,0 0,0,0 0,1,0
-1.5,0,0 0,-1.5,0 0,-0.5,0"
TriangleIndices="3,4,5,7,8,9"/>
斯科拉扣篮再如下例子,利用坐标索引构建不同形状的三角形
<MeshGeometry3D Positions="
1,0,0 0,-1,0 0,0,1
-1,0,0 0,0,0 0,1,0
-1.5,0,0 0,-1.5,0 0,-0.5,0"
TriangleIndices="3,1,2,0,1,2,3,0,5"/>
利用多个三角形构建多边形
2个三角形就可以构成一个4边形,同理也可以构建多边形
<MeshGeometry3D Positions="
1,0,0 0,-1,0 0,0,1
1,0,0 0,0,0 0,-1,0
"/>
效果图
两个面的平面(BackMaterial)
如一张纸有两个面
<GeometryModel3D>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="
-0.5,0.5,-0.5
-0.5,-0.5,-0.5