在 WPF (Windows Presentation Foundation) 中,3D 控件是一个非常强大的功能,它允许你在应用程序中添加三维图形和模型。你可以使用 WPF 的 3D API 来创建、显示和交互三维内容。以下是 WPF 中使用 3D 控件的一些基本概念和实现方法。

1. WPF 3D 基础

WPF 提供了丰富的 3D 图形支持。通过 Viewport3D 控件,你可以将 3D 图形嵌入到 WPF 窗口中,并通过 Model3D 类来创建三维模型。

核心类:

  • Viewport3D:这是一个承载 3D 内容的控件,类似于 2D 的 Canvas
  • Model3D:表示 3D 场景中的实体模型,可以是几何体、材质、光源等。
  • Camera:控制视角,定义观察 3D 场景的视点。
  • Lights:用于照亮场景中的物体。
  • Transform3D:用于在 3D 空间中进行平移、旋转、缩放等操作。

2. 创建一个简单的 3D 场景

下面是一个简单的 WPF 3D 示例,展示如何使用 Viewport3D 来显示一个立方体。

2.1 XAML 代码

<Window x:Class="WPF3DExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="3D Example" Height="450" Width="800">
    <Grid>
        <!-- 3D Viewport -->
        <Viewport3D Name="viewport">
            <!-- Define a camera to view the scene -->
            <Viewport3D.Camera>
                <PerspectiveCamera Position="0,0,5" LookDirection="0,0,-1" UpDirection="0,1,0" FieldOfView="60"/>
            </Viewport3D.Camera>

            <!-- Define a light source -->
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <DirectionalLight Color="White" Direction="-1,-1,-1"/>
                </ModelVisual3D.Content>
            </ModelVisual3D>

            <!-- Define a 3D model (a simple cube) -->
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D Positions="0,0,0 1,0,0 1,1,0 0,1,0 0,0,1 1,0,1 1,1,1 0,1,1"
                                            TriangleIndices="0 2 1 0 3 2 0 7 3 0 4 7 4 5 7 5 6 7 1 2 6 1 6 5 2 3 6 2 6 5"
                                            Normals="0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,1 0,0,1 0,0,1 0,0,1"/>
                        </GeometryModel3D.Geometry>
                        <GeometryModel3D.Material>
                            <DiffuseMaterial Brush="SkyBlue"/>
                        </GeometryModel3D.Material>
                    </GeometryModel3D>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>
    </Grid>
</Window>

2.2 代码解析

  • Viewport3D:这是一个容器控件,用来显示 3D 场景。
  • PerspectiveCamera:定义了摄像机的位置、朝向和视场角度。摄像机是观察 3D 场景的关键,设置 Position 来改变视角,LookDirection 来设置观察的方向。
  • ModelVisual3D:用来显示 3D 对象。它包含了一个 GeometryModel3D,这个对象实际呈现一个立方体。
  • DirectionalLight:用来提供光照,使得模型能够被正确渲染。光源方向是通过 Direction 属性定义的。
  • MeshGeometry3D:定义了立方体的几何体,Positions 属性列出了立方体的 8 个顶点,TriangleIndices定义了每个三角形的顶点索引,Normals 提供了面法线数据以便正确渲染光照。

3. 控制 3D 模型的旋转

要控制 3D 模型的旋转,可以使用 Transform3D 类来进行模型变换。你可以在 XAML 中直接使用,也可以在 C# 中通过代码来动态应用变换。

3.1 在 C# 中动态旋转

通过在后台代码中对 Model3D 添加 Rotation,可以让模型实现动态旋转:

using System.Windows;
using System.Windows.Media.Media3D;
using System.Windows.Threading;

namespace WPF3DExample
{
    public partial class MainWindow : Window
    {
        private RotateTransform3D rotateTransform;
        private AxisAngleRotation3D rotation;

        public MainWindow()
        {
            InitializeComponent();

            // 获取模型
            var geometryModel3D = ((GeometryModel3D)((ModelVisual3D)viewport.Children[2]).Content);

            // 创建旋转变换
            rotation = new AxisAngleRotation3D(new Vector3D(1, 0, 0), 0); // 沿着 X 轴旋转
            rotateTransform = new RotateTransform3D(rotation);

            // 将旋转应用到模型
            geometryModel3D.Transform = rotateTransform;

            // 设置定时器进行旋转
            var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(20) };
            timer.Tick += (sender, args) =>
            {
                rotation.Angle += 1; // 每次旋转 1 度
                if (rotation.Angle >= 360)
                {
                    rotation.Angle = 0; // 每轮旋转后重置
                }
            };
            timer.Start();
        }
    }
}

3.2 代码解析

  • AxisAngleRotation3D:这是一个旋转变换类,允许你围绕某一轴进行旋转。上面的例子是围绕 X 轴旋转。
  • RotateTransform3D:将旋转应用到 3D 模型。
  • DispatcherTimer:定时器,用于每 20 毫秒更新一次旋转角度。

4. 3D 动画

除了静态的模型,你还可以通过动画来动态改变 3D 场景中的对象。WPF 允许使用 Storyboard 和 DoubleAnimation 来对 Transform3D 进行动画处理。

4.1 动画示例

<Window x:Class="WPF3DAnimationExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="3D Animation" Height="450" Width="800">
    <Grid>
        <Viewport3D Name="viewport">
            <Viewport3D.Camera>
                <PerspectiveCamera Position="0,0,5" LookDirection="0,0,-1" UpDirection="0,1,0" FieldOfView="60"/>
            </Viewport3D.Camera>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <GeometryModel3D>
                        <GeometryModel3D.Geometry>
                            <MeshGeometry3D Positions="0,0,0 1,0,0 1,1,0 0,1,0 0,0,1 1,0,1 1,1,1 0,1,1"
                                            TriangleIndices="0 2 1 0 3 2 0 7 3 0 4 7 4 5 7 5 6 7 1 2 6 1 6 5 2 3 6 2 6 5"
                                            Normals="0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,1 0,0,1 0,0,1 0,0,1"/>
                        </GeometryModel3D.Geometry>
                        <GeometryModel3D.Material>
                            <DiffuseMaterial Brush="SkyBlue"/>
                        </GeometryModel3D.Material>
                    </GeometryModel3D>
                </ModelVisual3D.Content>
            </ModelVisual3D>
            <Storyboard x:Key="rotationAnimation">
                <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(RotateTransform.Angle)" To="360" Duration="0:0:2" Repeat

Behavior=”Forever”/>



### 5. **总结**

- WPF 提供了强大的 3D 支持,通过 `Viewport3D` 控件,你可以在应用中展示 3D 图形。
- **`GeometryModel3D`** 和 **`MeshGeometry3D`** 用于定义 3D 模型的几何形状。
- 你可以使用 **`Transform3D`** 对 3D 模型进行旋转、缩放、平移等变换。
- **`Storyboard`** 和 **`DoubleAnimation`** 可以实现 3D 动画效果。

希望这些示例能帮助你更好地理解 WPF 中的 3D 控件使用!如果你有更具体的需求或问题,欢迎继续提问。