7.2 3D图形基础
概述
WPF提供了强大的3D图形支持,允许开发者在应用程序中创建和操作三维对象。本节将介绍WPF中3D图形的基本概念、核心组件以及简单实现方法。
核心组件
1. Viewport3D
- 所有3D内容的容器控件
- 相当于2D中的Canvas,但专为3D场景设计
- 包含Camera(摄像机)和3D模型集合
<Viewport3D>
<!-- 摄像机设置 -->
<Viewport3D.Camera>
<PerspectiveCamera Position="0,0,5" LookDirection="0,0,-1"/>
</Viewport3D.Camera>
<!-- 3D模型内容 -->
</Viewport3D>
2. 3D模型构建
WPF使用以下类构建3D对象:
| 类名 | 用途 |
|---|---|
GeometryModel3D | 3D几何模型的基本单元 |
MeshGeometry3D | 定义模型的网格(顶点、三角形) |
Material | 定义模型表面外观 |
3. 基本几何体创建
通过定义顶点和三角形索引创建简单立方体:
MeshGeometry3D cubeMesh = new MeshGeometry3D
{
Positions = new Point3DCollection
{
// 前面
new Point3D(-1, -1, 1), new Point3D(1, -1, 1),
new Point3D(1, 1, 1), new Point3D(-1, 1, 1),
// 后面
new Point3D(-1, -1, -1), new Point3D(1, -1, -1),
// 更多顶点...
},
TriangleIndices = new Int32Collection
{
0,1,2, 2,3,0, // 前面
4,7,6, 6,5,4, // 后面
// 更多三角形...
}
};
光照与材质
1. 光源类型
WPF提供四种基本光源:
- AmbientLight(环境光)
- 均匀照亮所有表面
- DirectionalLight(平行光)
- 类似太阳光,方向固定
- PointLight(点光源)
- 从某点向所有方向发射
- SpotLight(聚光灯)
- 锥形光束效果
2. 材质应用
<GeometryModel3D.Material>
<DiffuseMaterial Brush="Blue"/>
</GeometryModel3D.Material>
3D变换
与2D类似,3D支持多种变换:
<GeometryModel3D.Transform>
<Transform3DGroup>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Axis="0,1,0" Angle="45"/>
</RotateTransform3D.Rotation>
</RotateTransform3D>
<TranslateTransform3D OffsetX="2" OffsetY="0" OffsetZ="0"/>
</Transform3DGroup>
</GeometryModel3D.Transform>
性能优化建议
- 尽量减少三角形数量
- 重用Material和Geometry资源
- 对静态模型使用
Freezable.Freeze() - 考虑使用LOD(Level of Detail)技术
示例:完整3D立方体
<Viewport3D>
<Viewport3D.Camera>
<PerspectiveCamera Position="0,0,8" LookDirection="0,0,-1"
UpDirection="0,1,0" FieldOfView="60"/>
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<Model3DGroup>
<!-- 光源 -->
<AmbientLight Color="#404040"/>
<DirectionalLight Color="#FFFFFF" Direction="-1,-1,-1"/>
<!-- 立方体模型 -->
<GeometryModel3D>
<!-- 网格定义 -->
<!-- 材质定义 -->
</GeometryModel3D>
</Model3DGroup>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
进阶学习方向
- 3D模型导入(通过Helix Toolkit等库)
- 复杂材质和纹理贴图
- 3D拾取(Hit Testing)
- 与2D元素的混合使用
注意:WPF的3D功能适合中低复杂度的3D需求。对于游戏或专业3D应用,建议考虑DirectX或Unity等专业引擎。
