如何从3D图像生成2D平面切割

时间:2009-08-24 02:41:34

标签: c# algorithm opengl 3d 2d

我想编写一个C#程序,通过“切片”3D对象或通过切割平面从渲染的3D对象生成2D图像。 2D图像的期望输出应该是可以使用CAD显示的数据。例如:

3D图像由其顶点定义,这些顶点包含在Point3DList()中。然后调用一个方法,将Point3DList作为参数,例如:Cut2D(Point3DList)。然后,该方法生成2D顶点并将其保存在Point2DList()中,这些顶点可以通过CAD程序读取,该程序以2D形式显示。

因此,我的问题是,在C#(.NET兼容)中是否存在先前的实现,或者是否有任何关于第三方组件/算法的建议来解决此问题。

提前致谢。

5 个答案:

答案 0 :(得分:5)

您提出了一个有趣的问题,部分原因是不包括3D形状的完整定义。您需要指定顶点和边,或者使用算法从顶点列表中获取边。由于从顶点列表获取边缘的算法转变为指定顶点和边缘,因此我将仅在此处介绍该情况。当顶点和边被转换为平面多边形列表时,我的描述也最有效。要将顶点列表分解为多边形,必须在由顶点和边创建的无向图中找到循环。对于具有顶点A,B和C的三角形多边形,最终将得到AB,BC和AC边。

我能想到的最简单的算法是:

  1. 变换所有点,使得Z轴为0的2D平面(旋转,扭曲,并根据需要移动,以将所需的2D平面变换为与Z = 0的XY平面对齐)。 / p>

  2. 对于每个扁平多边形:
    a。对于每条边,检查顶点在Z轴上是否具有相反的符号(或者如果一个是0)。如果Z0 * Z1 <= 0,那么情况就是这样 b。使用直线的定义并求解Z = 0的点。这将为您提供交叉点的X,Y c。您现在有一个点,线或多边形,表示从步骤1开始与2D平面相交的原始平面多边形的交点。
    d。填写由形状形成的多边形(如果需要)。如果2D渲染包不会从顶点列表创建多边形,则需要使用扫描线开始渲染像素。

  3. 每个单独的算法应该在“C语言中的算法”或类似的中。

    图形程序在开始工作时会非常有价值。

    玩得开心,

    雅各

答案 1 :(得分:0)

这是特定于opengl而不是c#特定的,但我要做的是:

用3d矩阵旋转和变换,这样你想要的“切片”就在摄像机的“前方”1米处。

然后将近和远地平线限制分别设置为1m和1.001m。

-update-你甚至使用opengl?如果没有,你可以自己以某种方式执行矩阵运算。

答案 2 :(得分:0)

听起来你想要得到一个平面与三维表面或物体的交点的二维表示。虽然我不知道算法会产生这样的事情(我在3D建模应用程序方面做得很少),但我认为这就是你所要求的。

几年前我在Graphics Gems或GPU Gems或类似的书中遇到过这样的算法。我通过一些Bing搜索找不到任何东西,但希望这会给你一些想法。

答案 3 :(得分:0)

如果它的3d纹理不能让你只为四边形的每个顶点指定3d tex coords(进入纹理)?不会自动插入纹素吗?

答案 4 :(得分:0)

如果您正在寻找第三方实施,也许您应该探索Coin3d。能够满足您的要求,但我不确定其确切的数据库格式或输入要求。我发现您的描述缺乏,因为您没有指定将3D图像投影到2d平面的方向。