65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 3D 中的裁剪平面,第 2 部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2018 年 8 月 21 日

CPOL

4分钟阅读

viewsIcon

10780

downloadIcon

302

演示 WPF 3D 中的裁剪平面,第 2 部分

引言

WPF 3D 中的裁剪平面,第 1 部分中,我演示了无限裁剪平面如何“切片”模型,移除裁剪平面一侧(即“后面”)的矩形。在本篇第 2 部分中,我将演示一个有限裁剪平面,它仅移除其中心点投影位于有限裁剪平面上(及其后面)的矩形。此外,我还进行了一些其他更改,如下文所述。

  1. 有限裁剪平面
  2. 按 **W** (Wireframe) 键可在海绵实心或线框之间切换。如果选择了纹理,则开启线框模式会移除纹理。
  3. 我添加了 Microsoft 的 3D 工具库(.NET 3.5)。
  4. 如果裁剪平面被隐藏(通过使用裁剪平面切换键 **P**),则旋转、平移和拉伸滑块将被禁用。
  5. 坐标轴的切换键现在是 **A** 而不是 **X**,因为我计划在下一版本中将 **X** 用于不同的目的。
  6. 左右箭头键的方向已反转,即右箭头键顺时针旋转相机,左箭头键逆时针旋转相机。现在还会显示相机所朝向的罗盘方向以及角度数值。
  7. 通过使用 **B** (Background) 切换键,可以显示由 6 个矩形组成的盒子作为背景,显示南北、东西、楼层和天花板。每个矩形都标有相应的方向。
  8. 设置文件现在包括裁剪平面的拉伸值、海绵是线框还是实心,以及背景是开启还是关闭。

下载并构建

下载 MengerSpongeClipping.zip 文件并解压缩。使用 Visual Studio 打开 MengerSpongeClipping 解决方案。它包含两个项目:MengerSpongeClipping WPF 应用程序和 Microsoft 3DTools 库。按照下文所述修改 app.config 指向图像文件。按 F6 生成解决方案;它应该能成功生成而不会出错。按 F5 在调试模式下运行 MengerSpongeClipping 项目。

使用代码

要裁剪 Menger 海绵,只需单击“Clip”按钮。您可以按照上方图像中的说明,使用滑块来定位裁剪平面。您可以使用“Rotate Plane”滑块围绕 x、y 或 z 轴旋转裁剪平面,并使用“Translate Plane”滑块沿 x、y 或 z 轴平移裁剪平面。

在此第 2 版中,默认情况下裁剪平面在所有方向上都被假定为无限的,但是当您按下“I”键(**I**nfinite Clipping Plane 切换)时,裁剪平面的前景和背景颜色会稍微变亮,并绘制一个黑色边框(参见 AddBorder())以提供视觉提示,表明平面是有限的,如上方图像所示。此外,裁剪平面 X 和 Y 的“Stretch”(拉伸)滑块被启用,允许您拉伸或缩小平面。当您使用有限裁剪平面裁剪海绵时,仅移除中心点会投影到平面上(且位于其后面)的矩形。您还可以使用“View”(视图)菜单选择有限或无限裁剪平面。

裁剪平面

为了实现有限裁剪平面,我添加了一个名为 bool IsPointOnPlane(Point3D point) 的方法,当给定点的投影位于由两个三角形定义的平面上时,该方法返回 true。该算法的详细信息由 Håkon Hægland 提供。使用 IsPointOnPlane,会忽略“超出”有限裁剪平面的矩形,对于所有剩余的矩形,与第 1 版一样,计算从平面到每个矩形中心的距离,并丢弃距离值小于零(即,位于不透明蓝色侧的后面)的矩形。

3D 工具库

Microsoft 的 3D 工具库允许您使用鼠标旋转和缩放模型(感谢 Ivan Krivyakov 提供的演示)。按住左鼠标按钮并移动鼠标进行旋转;按住右键并上下移动鼠标进行缩放。遗憾的是,似乎没有撤销鼠标移动的方法,即库中没有“重置”功能。(我也没有发现获取值来更新相机位置的方法)。为了解决没有重置的问题,我修改了 OnMouseDown 事件处理程序,以检测在 3D 视口左上角单击鼠标,从而撤销旋转和缩放以重置模型。有关详细信息,请参阅 TrackballDecorator.cs。按 **Esc** 键可重置使用箭头键设置的相机移动。

由于 3D 工具库允许您非常快速地旋转和缩放,因此很容易感到迷失方向。为了帮助保持空间感知,我添加了一个 DrawBackground() 方法,该方法创建一个由四个墙壁、一个地板和一个天花板组成的盒子。墙壁分别标记为 North、South、East 和 West。六个背景矩形使用纹理,因此使用了六个图像文件。如第 1 部分中所述,您需要修改 app.config 指向图像文件,例如

<setting name="ImageFileLocation" serializeAs="String">
	<value>C:\MyProjects\MengerSponge\MengerSpongeClipping\MengerSpongeClipping\Images\</value>
</setting>

背景默认关闭,但可以使用 **B** (Background) 切换键打开和关闭,如下所示,我已缩小并打开了背景

历史

版本 2.0.0.0

© . All rights reserved.