3D 几何库(基本类)以及使用 VB.NET 的 3D 绘图
本文介绍了使用 VB.NET 开发的 3D 几何库。
引言
我需要在一个图形显示器上绘制一个 3D 点的列表。 这些点列表由其他软件生成。 我必须使用 .NET 来完成此操作。 我没有使用 DirectX 或任何其他库。 我创建了一个 3D 几何库,其中只有像 Vector、Matrix 和 Point 这样的基本类。 还开发了一个测试应用程序来测试这个库。 该测试应用程序读取一个点数据文件并绘制连接读取的点的线。 它还具有沿不同轴查看 3D 对象的选项。 我是使用 VB.NET 2.0 完成的。
几何库(基本类)
这个几何库只包含一些基本类,如 Vector、Matrix 和 Point。 我为每个类创建了 2D 和 3D 类(Vector2D
、Vector3D
、Matrix2D
、Matrix3D
、Point2D
和 Point3D
)。 2D 类用于二维几何,3D 类用于三维几何。 您可以通过在网上搜索来获得关于几何,向量和矩阵功能的更详细的解释。
Point
点表示空间中的二维或三维点。 点由其 X 和 Y(3D 点情况下还有 Z)坐标表示。
向量
几何向量指定空间中的方向。 向量有两个属性:长度和方向。 向量在空间中没有固定位置。
我们的向量类具有标准的向量运算,如加法、减法、变换、求反、点积、叉积、求两个向量之间的夹角等。
矩阵
矩阵允许以一致的格式表示任意线性变换,适用于计算。 这也允许通过将它们的矩阵相乘来轻松地连接变换 - 来自维基百科。 我们使用 3x3 矩阵用于 2D,4x4 矩阵用于 3D。 您可以通过在网上搜索找到更多信息。
为了方便起见,我创建了特定的 2D 和 3D 矩阵类。 或者,可以创建一个通用矩阵类,并且 2D 和 3D 矩阵类可以从通用类派生。
我们的矩阵类具有标准的矩阵运算,如乘法、逆矩阵、旋转、缩放和变换等。
使用 3D 矩阵类
' create a new instance, which creates a identity matrix
Dim Mat As New Matrix3D
' set the matrix for rotation, 90 degrees about X axis
Mat.SetToRotation(90 * Math.PI / 180.0, New Vector3D(1, 0, 0))
' use the matrix to transform the points
TransformPoints(Mat)
' create a new point
Dim Pt As New Point3D(50.0, 50.0, 0.0)
' transform the point with the matrix
Pt.TransformBy(Mat)
' resulting point will be : (50.0, 0.0, -50.0)
测试应用程序
该测试应用程序读取一个点数据文件,并绘制连接点列表的线。 该文件包含一个 3D 点的列表。 X、Y 和 Z 坐标用空格分隔,并且每个点都存储在新行中。
0.0 0.0 0.0
0.0 0.0 50.0
50.0 0.0 50.0
函数 PointReader
和 ReadPointFromString
解析数据文件并填充点数组。 在此示例数据文件中,对点进行操作以获得所需的结果。 但最初的要求是在屏幕上绘制这些点。 但是为了演示几何库,我考虑绘制线条,以显示 3D 形状对象。
查看各种视图
测试应用程序的功能包括从 X 轴、Y 轴、Z 轴和 3D 视图查看 3D 对象。
例如,为了获得从 X 方向的视图,首先我们将点转换到原始位置,然后创建所需的矩阵对象并将点变换到所需的位置。
' set the drawing to initial position (looking from Z)
Dim Mat As New Matrix3D
' create a new matrix object and set that to the
' inverse of the existing matrix Mat = TransMat.GetInverse
' transform the points to the initial position
TransformPoints(Mat)
TransMat.PostMultiplyBY(Mat)
Mat.SetToIdentity()
' create a matrix with the required rotation
Mat.SetToRotation(90 * Math.PI / 180.0, New Vector3D(0, 1, 0))
' and transorm the points TransformPoints(Mat)
' update the matrix data member
TransMat.PostMultiplyBY(Mat)
' refresh the drwing area
PanelDraw.Invalidate()
我正在使用 Panel
控件来绘制图形,使用双缓冲概念来避免在图形刷新时闪烁(http://www.thescripts.com/forum/thread267635.html)。
希望这篇文章对您有所帮助。 可能有更好的方法来实现需求。 如果有任何意见和澄清,请告诉我。