【问题标题】:How To Produce A 2D Plane Cut from a 3D Image如何从 3D 图像生成 2D 平面切割
【发布时间】:2009-09-01 19:20:23
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • 3D 图像是指 3D 纹理、3D 多边形模型还是 3D 点云?
  • 你能仅仅通过点来定义一个3D对象吗?我认为即使对于平面实体,您仍然需要定义边缘?
  • 如果您还指定算法,则可以。我不确定名称,但可以使用包裹所有点的最小表面(最少包裹?)。或者,如果您确保每个表面的点是有序的并且开始/结束于同一点,那么您可以通过这种方式定义一个 3D 表面。

标签: c# algorithm opengl 3d 2d


【解决方案1】:

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

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

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

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

每个单独的算法都应该在“Algorithms in C”或类似内容中。

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

玩得开心,

雅各布

【讨论】:

  • 嘿,我认为这可行,但是:1)在您说“Z 轴”的第一步中,我认为您的意思是“XY 平面”之类的东西 2)我很模糊在中间部分。在步骤 3 中检测到从 +ve Z 到 -ve Z 的所有边缘之后,您可能会找到边缘与 z==0 相交的点。然后你就有了这些点的集合。你如何知道在第四步中连接这些点以形成你的二维线的顺序?我想我在问你如何确定你在第四步中提到的“相邻边缘”。 3) 您是否考虑对步骤进行编号以便于讨论?谢谢!
  • 1:是的,我说的是 Z=0 的 XY 平面。我已经调整了措辞。它是 Z=0 的平面。 2. 是的,错过了写下来。 4. 一旦你有了多边形的任何边与平面相交的位置,你就可以填充它们。由于这是一个单一的多边形,所有的边都由多边形的(假定的)平面连接。边缘内包含的任何开放空间也可以被填充。我将调整此描述并编号步骤。感谢您的出色反馈! +1
【解决方案2】:

这是更特定于 opengl 而不是特定于 c#,但我会做什么:

通过 3d 矩阵进行旋转和变换,使您想要的“切片”位于相机“前方”1 米处。

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

-update- 你还在用opengl吗?如果没有,您可以以某种方式自己执行矩阵算术。

【讨论】:

  • 嘿克里斯,这是一个很酷的想法,但它有一些小皱纹。我确信 Chris 知道它们,但只是为了清楚起见: 1) 这种技术的输出可能是随后渲染模型的输出。这给出了一个位图,这并不是问题所要求的。 2)从 1m 到 1.001m 的切片的有限大小意味着 1.0005m 处的 3D 对象上的特征将包含在横截面中,而理想情况下它们不应该包含。不是一个大人物,但激怒了我的几何纯粹主义者。这些(尤其是第一个)可以修复吗?拥抱!
  • 采用这种方法的最佳选择是两条边之一是
  • 这个选项是一个非常酷的主意,我只是想问你,你认为如何保持部分由线条组成。
【解决方案3】:

听起来您想要获得平面与 3D 表面或物体的交点的 2D 表示。虽然我不知道生成这种东西的算法(我在 3D 建模应用程序方面做得很少),但我认为这就是您要问的问题。

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

【讨论】:

    【解决方案4】:

    如果它的 3d 纹理不能只为四边形的每个顶点指定 3d tex 坐标(到纹理中)?那不会自动插入纹素吗?

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 2010-12-19
        相关资源
        最近更新 更多