一、三维坐标系系统
WPF采用右手坐标系系统,空间定位遵循:
X 轴 → 右 Y 轴 → 上 Z 轴 → 观察方向 X轴 \rightarrow 右\quad Y轴 \rightarrow 上\quad Z轴 \rightarrow 观察方向 X轴→右Y轴→上Z轴→观察方向
三维坐标值表示为 ( x , y , z ) (x, y, z) (x,y,z),旋转角度使用欧拉角体系。当进行三维变换时,遵循矩阵组合规律:
M t r a n s f o r m = M t r a n s l a t i o n × M r o t a t i o n × M s c a l e M_{transform} = M_{translation} \times M_{rotation} \times M_{scale} Mtransform=Mtranslation×Mrotation×Mscale
二、视口与摄像机
如果使用3D内容,就需要有容器来包含3D内容。这个容器是Viewport3D类,该类位
于System.Windows.Controls名称空间。Viewport3D类继承自FrameworkElement类,所以它可
以放到能够放置正常元素的任何地方。例如,可以使用它作为窗口或页面的内容,也可以将它
放到更复杂的布局中。
Viewport3D类只应用于复杂的3D编程。它常用的两个属性——Camera和Children
- Camera属性 定义了3D场景的观察者(相机)
- Children属性包含了希望放在场景中的所有3D对象。
当然,照亮3D场景的光源本身也是视口中的一个对象。
- Viewport3D容器结构代码
<Viewport3D x:Name="viewport3D">
<!--相机-->
<Viewport3D.Camera>
<PerspectiveCamera Position="100,100,100" LookDirection="-100,-100,-100" UpDirection="0,0,1" FieldOfView="10">
<PerspectiveCamera.Transform>
<RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
<RotateTransform3D.Rotation>
<!--视野可以绕物体中心轴旋转-->
<AxisAngleRotation3D Axis="0 0 1" Angle="180"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
</PerspectiveCamera.Transform>
</PerspectiveCamera>
</Viewport3D.Camera>
<!--光源 离散的白色光源-->
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<AmbientLight Color="#999" />
<!--点光源-光影层次感-->
<PointLight Color="#DDD" Position="100,0,100"/>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
<!--模型-->
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<GeometryModel3D>
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Orange"/>
</GeometryModel3D.Material>
<GeometryModel3D.BackMaterial>
<DiffuseMaterial Brush="Orange"/>
</GeometryModel3D.BackMaterial>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="2.5,0,0.5 -2.5,0,0.5 2.5,2,0.5 -2.5,2,0.5
2.5,0,0 -2.5,0,0 2.5,2,0 -2.5,2,0"
TriangleIndices="0,2,1 1,2,3"/>
</GeometryModel3D.Geometry>
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
运行效果
注意:
在Viewport3D类的继承属性中,有一个属性特别重要:ClipToBounds。如果将该属性设置
为true(默认值),超出视口边界的内容将被剪裁掉。如果设置为false,内容会显示在相邻元素
的上面。这种行为和Canvas控件的ClipToBounds属性的行为相同。然而,当使用Viewport3D
类时有如下重要的区别:性能。如果将Viewport3D.ClipToBounds属性设置为false,当渲染复
杂的、频繁更新的3D场景时,可显著提高性能。
- 摄像机类型对比
- PerspectiveCamera(透视投影)
<PerspectiveCamera
Position="0,0,5"
LookDirection="0,0,-1"
UpDirection="0,1,0"
FieldOfView="60"/>
- OrthographicCamera(正交投影)
<OrthographicCamera
Position="0,0,5"
LookDirection="0,0,-1"
Width="10"/>
三、光照体系
光照类型 | 特点 | 适用场景 |
---|---|---|
AmbientLight | 均匀环境光 | 基础照明 |
DirectionalLight | 平行光源(类似太阳光) | 主体照明 |
PointLight | 点光源(球状衰减) | 局部照明 |
SpotLight | 聚光灯(锥形照射) | 特殊效果 |
<ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="White" Direction="-1,-1,-1"/>
</ModelVisual3D.Content>
</ModelVisual3D>
四、几何模型构建
- MeshGeometry3D核心属性
var geometry = new MeshGeometry3D {
Positions = new Point3DCollection {
new Point3D(-1,1,1), // 顶点坐标集合
new Point3D(1,1,1),
// ...其他顶点
},
TriangleIndices = new Int32Collection {
0,1,2, // 三角形索引
2,3,0,
// ...其他面
},
TextureCoordinates = new PointCollection {
new Point(0,0), // 纹理坐标
new Point(1,0),
// ...其他贴图坐标
}
};
- 材质与着色器
<GeometryModel3D.Material>
<MaterialGroup>
<DiffuseMaterial Brush="Blue"/>
<SpecularMaterial
Brush="White"
SpecularPower="20"/>
</MaterialGroup>
</GeometryModel3D.Material>
五、WPF3D中常见的几个类
类名 | 说明 |
---|---|
Viewport3D | 定义了用于渲染3D对象的表面。它作为容器包含所有3D绘图的可见元素,是创建3D场景的基础组件。 |
ModelVisual3D | 包含在Viewport3D 中,负责展示3D模型的所有可见部分。支持对整个模型应用变换操作(如旋转、缩放和移动),以便调整模型在3D空间中的位置和方向。 |
GeometryModel3D | 是ModelVisual3D 的一个具体实现,用于定义3D模型的具体外观。它不仅包含几何形状(通过MeshGeometry3D 定义),还包含了材质信息,以确定模型的颜色和纹理等视觉属性。 |
Geometry3D | 抽象基类,提供了定义几何形状的基本框架。它的具体实现MeshGeometry3D 允许用户通过指定三角形的位置来构建复杂的3D模型。 |
Material | 抽象基类,用于定义应用于MeshGeometry3D 上的材质属性,影响3D模型的外观。包括EmissiveMaterial (自发光)、DiffuseMaterial (漫反射光)、SpecularMaterial (镜面反射光)等,以及可以通过MaterialGroup 将多种材质组合使用。 |
Light | 抽象基类,提供基础照明功能。其子类包括AmbientLight (环境光,无方向性)、DirectionalLight (定向光源,模拟太阳光)、PointLight (点光源,从一个点向四周均匀发光)和SpotLight (聚光灯,发出锥形光线)。这些光源共同作用,为3D场景提供逼真的光照效果。 |
Camera | 抽象基类,用于控制3D场景如何投影到2D显示表面上。PerspectiveCamera 模拟人眼视角,远处物体显得更小;OrthographicCamera 不考虑距离因素,适用于技术制图;而MatrixCamera 则允许更灵活地设置视图转换矩阵。 |
Transform3D | 抽象基类,提供对3D对象进行变换的能力。包括TranslateTransform3D (位移变换)、ScaleTransform3D (缩放变换)、RotateTransform3D (旋转变换)、MatrixTransform3D (基于矩阵的变换)和Transform3DGroup (组合多个变换)。 |
通过合理运用坐标系系统、摄像机配置、光照方案和材质组合,开发者可以构建出具有专业级表现力的三维交互界面。建议通过实际调试不同参数组合来深入理解各元素的视觉影响。