在探索3D图形编程的过程中,实现Menger海绵的裁剪平面是一个有趣且具有挑战性的任务。本文将介绍如何在WPF环境中实现这一功能,并探讨与之相关的其他特性,如轴、光照、纹理、进度条和菜单栏等。
首先,下载并解压MengerSpongeClipping.zip
文件,使用Visual Studio打开MengerSpongeClipping
项目。通过按F6键构建项目,然后按F5键以调试模式运行项目。
要裁剪Menger海绵,只需点击“裁剪”按钮。可以通过滑块调整裁剪平面的方向,如上图所示。可以使用“旋转平面”滑块围绕x、y或z轴旋转裁剪平面,也可以使用“平移平面”滑块沿x、y或z轴移动它。在这个版本中,裁剪平面被假设为在所有方向上都是无限的,因此平移仅用于演示目的,并不会影响实际的裁剪效果。裁剪平面的正侧是半透明的绿色;负侧是半透明的蓝色。
裁剪平面的实现相对简单:计算每个矩形中心到平面的距离,然后丢弃距离值小于零的矩形(即在半透明蓝色侧后面的矩形)。方法DrawClippingPlane()
执行以下步骤:
DistanceFromPlaneToPoint()
使用裁剪平面的方程来确定到矩形中心的距离。方法RemoveClippedRectangles()
计算距离并从RectanglesMade
中移除裁剪的矩形。方法DrawClippedSponge()
重新绘制Menger海绵。
使用了Stephens先生的WPF圆柱体代码来绘制x、y、z轴。可以通过按“A”键(轴切换键)或使用菜单栏中的“视图”来切换它们。为了标记轴,使用了Eric Sink的CreateTextLabel3D()
方法;添加了另一个参数,一个Transform3DGroup transform
。详情请参阅TextLabel3D.cs
。
在WPF(以及DirectX和OpenGL)中,定向光是一种沿着指定向量投射效果的光。Vector3D lightVector1
、Vector3D lightVector2
、Color lightColor1
和Color lightColor2
是DirectionalLight()
构造函数的输入。由于有时通过指定向量来可视化光的方向可能有些困难,使用了Stephens先生的WPF圆锥体代码来绘制“手电筒”(在英国被称为“torch”),显示定向光指向哪里。有两个定向光,分别命名为Light 1和Light 2。手电筒默认情况下是禁用的(不显示)以保持清晰。要启用(显示)它们,按“F”键(手电筒切换键)或使用菜单栏中的“视图”。手电筒是否启用并不影响实际的光照;换句话说,它们仅用于使光照向量更容易可视化。
可以通过从“纹理”下拉框中选择一个图像文件来为Menger海绵添加纹理。为了使用这个功能,首先需要修改app.config
以指向图像文件,例如:
<setting name="ImageFileLocation" serializeAs="String">
<value>C:\MyProjects\MengerSponge\MengerSpongeClipping\MengerSpongeClipping\Images\</value>
</setting>
这部分代码来自Stephens先生关于纹理的另一篇有用的文章。
由于绘制的矩形数量由SpongeDepth
决定,添加了一个WPF进度条来显示重新绘制裁剪Menger海绵的进度,如下图所示。代码演示了如何使用BackgroundWorker
对象。如果机器运行速度很快,为了获得完整的效果,可能需要按F5键以调试模式运行程序,因为在调试模式下有一些控制台输出会稍微减慢进程。