问题标签 [marching-cubes]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
5692 浏览

performance - 如何加快行进方块?

我正在使用这个行进立方体算法来绘制 3D 等值面(移植到 C#,输出MeshGeomtry3Ds,但其他方面相同)。生成的曲面看起来很棒,但需要很长时间来计算。

有什么方法可以加快行进方块的速度吗?最明显的一种是简单地降低空间采样率,但这会降低生成的网格的质量。我想避免这种情况。

我正在考虑一个两遍系统,其中第一遍采样空间更粗糙,消除场强远低于我的等值的体积。这是明智的吗?有哪些陷阱?

编辑:代码已被分析,大部分 CPU 时间在行进立方体例程本身和每个网格单元角的场强计算之间分配。字段计算超出了我的控制范围,因此加快立方体例程是我唯一的选择......

我仍然对尝试消除死空间的想法很感兴趣,因为这会大大减少对两个系统的调用次数。

0 投票
1 回答
1611 浏览

math - 带有行进立方体的隐式曲面上的 CSG 操作

我用行进立方体渲染等值面,(或者可能是行进正方形,因为这是 2D),我想做集合操作,比如设置差异、交集和联合。我认为这很容易实现,只需在来自两个不同隐式曲面的两个顶点标量之间进行选择,但事实并非如此。

对于我的初始测试,我尝试了两个球体圆圈,并设置了操作差异。即A - B。一个圆圈在移动,另一个圆圈是静止的。这是我在选择顶点标量以及将角顶点分类为内部或外部时尝试的方法。代码是用 C++ 编写的。OpenGL 用于渲染,但这并不重要。没有任何CSG操作的正常渲染确实给出了预期的结果。



这给了我奇怪的锯齿:(来源:mechcore.net 看起来 CSG 操作是在没有插值的情况下完成的。它只是“丢弃”整个三角形。我是否需要以其他方式进行插值,或组合顶点标量值?我很想得到一些帮助。完整的测试用例可以在这里下载这里


编辑:基本上,我对行进广场的实施效果很好。这是我的标量场被破坏了,我想知道正确的方法会是什么样子。最好我正在寻找一种通用方法来实现我上面讨论的三个集合操作,用于通常的基元(圆形、矩形/正方形、平面)

编辑 2:以下是实施回答者白皮书后的一些新图像:

1.Difference
2.Intersection
3.Union

编辑 3:我也在 3D 中实现了这个,带有适当的阴影/照明:

1.大球和小球的区别 2.中心的大球和小球的区别
,被两边的两个平面夹住,然后与中心的球结合。
3.两个气缸之间的联合。

0 投票
2 回答
6432 浏览

mesh - 如何实时平滑由 Marching Cubes 生成的网格?

我现在正在为一个项目使用行进立方体算法(从 CT 图像实时渲染人类牙齿)。这是渲染结果:

http://www.freeimagehosting.net/uploads/4c2e2c94be.jpg

可以看到 MC 生成的网格不是那么平滑。你们知道任何可以应用于输出 MC 的实时平滑算法吗?或者,是否有任何改进版的 MC 可以生成光滑的表面?

请注意,平滑算法需要快速,因为稍后我必须在大约 30HZ 使用 MC,以便在交互式变形期间重新计算等值面。

0 投票
4 回答
2084 浏览

c++ - OpenGL,将纹理从图像应用到等值面

我有一个程序,我需要在其中应用二维纹理(简单图像)到使用 Marching-cubes 算法生成的表面。我可以访问几何图形并且可以相对轻松地添加纹理坐标,但是生成坐标的最佳方法是躲避我。

体积中的每个点代表一个数据单元,每个数据单元可能具有不同的属性。为了简化事情,我正在考虑将它们分类为“类型”并为每种类型分配一个纹理(或单个大型纹理图集的一部分)。

我的问题是我不知道如何生成适当的坐标。我可以将类型纹理的位置存储在类型类中并使用它,但是接缝会被严重拉伸(如果两个相邻点使用图集的不同部分)。如果可能的话,我想在接缝处混合纹理,但我不确定这样做的最佳方式。混合是可选的,但我需要以某种方式对顶点进行纹理处理。可以将几何图形拆分为每种类型的部分,或者复制顶点以用于纹理化目的,但这是不可取的。

如果可能,我想避免使用着色器,但如有必要,我可以使用顶点和/或片段着色器来进行纹理混合。如果我确实使用着色器,那么告诉它是纹理还是要采样的部分的最有效方法是什么?似乎通过参数传递类型是最简单的方法,但可能很慢。

我的体积相对较小,每个维度有 8-16 个点(我将它们保持较小以加快生成速度,但在给定时间屏幕上有很多)。我简要地考虑过使等值面成为体积分辨率的两倍,因此每个点都有更多的顶点(理论上是 8 个),这可以简化纹理。不过,这似乎不会让混合变得更容易。

为了构建表面,我使用了OpenGL 的可视化库及其行进立方体和体积系统。我的几何生成很好,只需要弄清楚如何纹理它。

有没有办法有效地做到这一点,如果有的话怎么办?如果没有,是否有人知道处理体积纹理的更好方法?

编辑:请注意,纹理不仅仅是颜色的渐变。它实际上是一种纹理,通常带有图案。因此,映射它的困难,梯度将是微不足道的。

编辑 2:为了帮助澄清问题,我将添加一些示例。他们可能只是混淆了事情,所以如果可以的话,把所有事情都考虑在确定的事实之上,这些都只是帮助。

我的几何图形总是在立方体中(在立方体中加载、生成和保存)。如果形状影响可能的解决方案,就是这样。

我需要将由图案和/或颜色(取决于点的“类型”的独特的)组成的纹理应用到几何体,其技术类似于为地形完成的飞溅(但这不是地形,所以我不'不知道是否可以使用相同的技术)。

着色器是一种快速简便的解决方案,尽管我想尽可能避免使用它们,正如我之前提到的。可用于固定功能管道的东西更可取,主要是为了稍微增加兼容性和开发时间。因为它只是一个小的增加,如果需要,我将使用着色器和多通道渲染。

不确定是否需要任何其他澄清,但我会根据需要更新问题。

0 投票
1 回答
920 浏览

opengl - 希望帮助寻找资源以使用 opengl 生成 3d 元球

我希望使用 OpenGl 和 C++ 来生成程序实时元球动画。

任何人都可以建议一个好的资源/教程来生成元球,和/或实现行进立方体算法。

我花了相当多的时间在谷歌上搜索,但从来没有做过比基本的 GLSL 着色器/基本的程序地形生成/使用 OpenGL 的简单粒子生成更复杂的事情,我发现很难从谷壳中分拣出小麦。

谢谢你的帮助!

0 投票
1 回答
1228 浏览

image-processing - 行进的正方形和封装的轮廓

这是一张图片:

在此处输入图像描述

是否可以使用行进正方形算法编写一个程序,给定上面的输入图像,产生以下输出:

两条链状线段,一条形成上述轮廓(山状),另一条形成封装的圆形轮廓?

如果没有,您还建议怎么做?

0 投票
3 回答
1429 浏览

opengl-es - 行进方块?

我有一个由点组成的对象,比如说它的点云,我想从这些点渲染对象,我希望对象看起来像那些点被包裹在一张纸中。我想为它制作动画,所以我首先想到的是移动立方体,但我的对象不会是球或立方体,它会变形,有没有比移动立方体更简单的方法?

0 投票
2 回答
2910 浏览

3d - 二维点云的轮廓

我在二维中散布了点云。我的问题是我想获得边界点来获得点云​​的轮廓。

我知道这个“行进广场”,但是这个算法通常用于 2d 中的像素。任何人都知道如何从二维点云或“行进广场”算法的细节中获取轮廓?此外,凸包在我的情况下不起作用。

提前致谢。

0 投票
1 回答
438 浏览

c++ - 3d 等值面与平面相交后的顶点排序

这是另一个几何问题:

我使用行进立方体算法创建了点云的 3 维三角等值面。然后我将这个等值面与一个平面相交并得到一些线段,这些线段代表相交的轮廓线。

是否有可能顺时针对这些线段的顶点进行排序,以便我可以将它们绘制为封闭路径并进行洪水填充?

提前致谢!

0 投票
1 回答
3441 浏览

c++ - c++ 中的开源行进立方体算法?

我正在尝试使用行进立方体来可视化分子密度,我想知道网络上是否有一个地方有一个开源库可以做到这一点。我见过很多人在网上发布他们的代码,但我不想“窃取”代码。

我知道我可以通过电子邮件向他们请求许可,我最终可能会这样做,但我想知道是否有一个用于计算机图形的 LAPACK 类型库,它有一个行进立方体例程,我可以链接到它。

我的意思是 LAPACK 只是具有执行预定线性代数计算的函数,人们很常见的是简单地链接到 LAPACK(或类似的东西)而不是从头开始编写自己的代码。

是否有像这样用于行进立方体的包或库?