问题标签 [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 投票
1 回答
4160 浏览

c++ - Marching Cubes,体素,需要一些建议

我正在尝试构建一个适当的可破坏地形,仅用于研究目的。好吧,一切都很顺利,但分辨率还不够让我满意。我已经看过很多人们如何实现 MC 算法的示例,但据我所知,其中大多数使用函数对最终网格进行三角剖分,这不适合我。

我将尝试简要解释我是如何构建我的地形的,也许你们中的一些人会给我建议如何改进或提高最终地形的分辨率。

1) 预先计算 MC 三角形。

我正在为每个案例(0-255)运行简单的循环遍历 MC 查找表并计算愤怒的三角形:[0,0,0] - [1,1,1]。这里没有问题。

2) 地形

我有地形类,它存储我的体素。一般来说,它看起来像这样:

因此,每个轴的长度为 32 个单位,但是,我存储每个位的体素信息。意思是如果位打开(1),有一些东西,应该有一些东西。

我有几个功能:

打开或关闭体素的位置。(有助于使用位)。

一旦分配了地形,我就会运行 perlin 噪声,并打开或关闭位。

我的地形类还有一个功能,从 x,y,z 位置提取 Marching Cubes 案例编号 (0-255):

通过确定该体素的邻居是打开还是关闭。这里没有问题。

3) 渲染部分

我正在循环每个轴,提取案例编号,然后按案例获取预先计算的三角形,转换为 x、y、z 坐标,并绘制这些三角形。这里没有问题。

所以结果看起来像这样:

地形

但正如您所看到的,在任何单个位置,分辨率都无法与例如此相比:( 来源:angelfire.comMC

我在 MC 示例中看到人们正在使用一种叫做“iso values”的东西,我不明白。任何关于如何改进我的工作的建议,或者什么是 iso 值,以及如何在统一的网格中实现它都会非常可爱。

0 投票
1 回答
2031 浏览

terrain - 基于体素的地形的适当密度函数?

我已经设法在 C# 中实现了 Marching Cubes 算法。到目前为止,我已经尝试过渲染球体的算法。这很容易,因为密度函数的编码不是很复杂。

但现在我想让算法更进一步,为游戏渲染一些有趣的地形。所以我需要适当的密度函数来完成这项任务。我首先想到的是体积 Perlin 噪声。没关系,但我正在寻找一个没有凸形的地形,我的意思是,目前没有洞穴和类似的几何形状。

好的,我知道一个简单的高度图可以完成这项工作,但我想要一个体素生成的地形。我需要什么类型的密度函数或伪代码来实现它们?

0 投票
3 回答
5208 浏览

algorithm - 行进立方体歧义与行进四面体

我已经成功实现了行进立方体算法。我使用标准材料作为参考,但我完全从头开始重写。它有效,但我正在观察导致网格中出现孔洞的歧义。

我正在考虑行进四面体算法,据说它不会受到歧义的影响。我看不出这是怎么可能的。

行进四面体算法使用六个四面体代替立方体,每个四面体都有三角剖分。但是,假设我要实现行进立方体算法,但是对于 256 个三角剖分中的每一个,只需选择立方体四面体三角剖分的“总和”(并集)吗?据我所知,这就是行进四面体所做的——那么为什么这能神奇地解决歧义呢?

我认为有 16 个独特的案例,其他 240 个只是这 16 个案例的反映/旋转。我记得在某处读过一些论文,为了解决歧义,你需要 33 个案例。这可能与为什么行进的四面体不会出现问题有关吗?

所以,问题:

  1. 为什么行进的四面体不会出现歧义?
  2. 如果没有,为什么人们不使用行进立方体算法,而是使用四面体的三角剖分呢?

我觉得我在这里遗漏了一些东西。谢谢。

0 投票
1 回答
1439 浏览

c# - 使用噪声生成行进立方体地形?

我已经成功地在 C# XNA 中制作了一个行进立方体类,并且正在使用 Lib 噪声来生成 3d perlin 噪声,但是当我尝试使用 perlin 噪声的值作为我的行进立方体的密度来生成地形时,它会生成一大块行进的立方体,里面有看似随机的三角形。我分离了行进立方体,并给它任意的 3d 密度数组来运行,这样我就可以确保一切正常并且看起来很好,我让地形生成代码生成了正常的立方体,我得到了一个正常的地形,但是问题是每个立方体的角落从噪声中获取值总是从负数转换为正数如此之快,以至于行进的立方体看起来就像一团乱七八糟的东西。

这是我用来生成地形的代码:

GetDensity 方法如下:

我认为问题在于我没有正确使用噪音来获得行进立方体角的密度,但到目前为止,我的谷歌搜索结果根本没有太大帮助。那么有谁知道如何正确使用噪声来生成平滑的地形?或者还有什么可能导致这个问题?

我在http://imgur.com/a/D1uMC发布了屏幕截图 ,前两个使用行进立方体显示,最后一个是普通立方体。

编辑:所以从图片中我发现行进的立方体实际上是按照它们所赋予的值来工作的,问题在于我的噪音以及我如何使用它。有谁知道任何好的资源用于基于噪声的 3d 地形生成?

0 投票
2 回答
717 浏览

c++ - 行进立方体(C++ 到 C#)

我正在尝试在 C# 中实现行进多维数据集,但我遇到了我不了解算法并且不知道如何实现它的部分。

int Polygonise(GRIDCELL grid, double isolevel, TRIANGLE *triangles)

第三个论点我不太明白。我知道它是一个指针,但稍后在算法中,当您设置三角形时,它看起来好像triangles变量是TRIANGLE结构的数组:

注意triangles[ntriang]. 这没有意义,因为在我们设置trianglesTRIANGLE *triangles. 我也不明白为什么它是一个指针。

0 投票
3 回答
25797 浏览

opengl - 什么会导致 glDrawArrays 生成 GL_INVALID_OPERATION 错误?

我一直在尝试使用 OpenGL 和 GLSL 编写 Marching Cubes 算法的两遍 GPU 实现,类似于 GPU Gems 3 第一章中详述的那个。但是,glDrawArrays在我的第一遍调用中始终以GL_INVALID_OPERATION.

我查找了所有我能找到的文档,并找到了glDrawArrays可能引发该错误的这些条件:

  1. GL_INVALID_OPERATION如果非零缓冲区对象名称绑定到启用的数组或GL_DRAW_INDIRECT_BUFFER绑定,并且缓冲区对象的数据存储当前已映射,则生成。
  2. GL_INVALID_OPERATION如果glDrawArrays在 的执行glBegin和对应的 之间执行,则生成glEnd
  3. GL_INVALID_OPERATION将由glDrawArraysglDrawElements如果当前​​程序对象中的任何两个活动采样器属于不同类型,但引用相同的纹理图像单元。
  4. GL_INVALID_OPERATION如果几何着色器处于活动状态并且模式与当前安装的程序对象中几何着色器的输入基元类型不兼容,则会生成。
  5. GL_INVALID_OPERATION如果模式是GL_PATCHES并且没有曲面细分控制着色器处于活动状态,则生成。
  6. GL_INVALID_OPERATION如果将图元的顶点记录到用于变换反馈目的的缓冲区对象会导致超出任何缓冲区对象大小的限制,或者超出由 设置的结束位置偏移量 + 大小 - 1,则会生成glBindBufferRange
  7. GL_INVALID_OPERATION如果不存在几何着色器,则生成glDrawArrays()变换反馈,并且模式不是允许的模式之一。
  8. GL_INVALID_OPERATION如果存在几何着色器,则生成glDrawArrays()变换反馈,并且几何着色器的输出图元类型与变换反馈图元模式不匹配。
  9. GL_INVALID_OPERATION如果绑定的着色器程序无效,则生成。
  10. EDIT 10/10/12: GL_INVALID_OPERATION在使用变换反馈时生成,并且绑定到变换反馈绑定点的缓冲区也绑定到数组缓冲区绑定点。这是我遇到的问题,因为我绑定的缓冲区有错字。虽然规范确实声明这是非法的,但在我找到的任何文档中,它都没有列在 glDrawArrays 下作为它可能引发错误的原因之一。

不幸的是,我找不到任何一份官方文档涵盖其中的 3 个以上。我不得不从众多来源收集这份清单。第 7 点和第 8 点实际上来自文档glBeginTransformFeedback,而第 9 点似乎根本没有记录。我在某处的论坛帖子中发现了它。但是,我仍然不认为这个列表是完整的,因为这些似乎都不能解释我得到的错误。

  1. 我根本没有在我的程序中的任何地方映射任何缓冲区。
  2. 我正在使用核心配置文件,因此glBegin甚至glEnd不可用。
  3. 我有两个采样器,它们的类型不同,但它们肯定映射到不同的纹理。
  4. 几何着色器处于活动状态,但它的输入布局是layout (points) in,并且glDrawArrays正在使用 调用GL_POINTS
  5. 我没有使用GL_PATCHES或任何类型的镶嵌着色器。
  6. 我已经确保我分配了几何着色器可能输出的最大空间量。然后我试着把它翻了两番。没有帮助。
  7. 有一个几何着色器。看下一点。
  8. 正在使用变换反馈,并且有一个几何着色器,但输出布局是layout (points) out并且glBeginTransformFeedback被调用GL_POINTS
  9. 我尝试在调用 toglValidateProgram之前插入对的调用glDrawArrays,它返回了GL_TRUE

实际的 OpenGL 代码在这里:

glDrawArrays实际错误是对in的调用RenderPass1。值得注意的是,如果我注释掉对glBeginTransformFeedbackand的调用glEndTransformFeedback,则glDrawArrays停止生成错误。所以不管有什么问题,它可能与变换反馈有关。

2012 年 8 月 18 日晚上 9 点编辑:

我刚刚在 gDEBugger 中发现了 NVIDIA GLExpert 功能,这是我以前不熟悉的。当我打开它时,它提供了更多关于 的信息GL_INVALID_OPERATION,特别是The current operation is illegal in the current state: Buffer is mapped.. 所以我遇到了上面的第 1 点。虽然我不知道怎么做。

我的代码中的任何地方都没有调用glMapBuffer或任何相关函数。glMapBuffer我将 gDEBugger 设置为在对、glMapBufferARB、和的任何调用时中断glMapBufferRange,并且它在任何地方都没有中断。然后我在开头添加了代码来显式地取消映射打扰缓冲区。错误不仅没有消失,而且对now 的调用都 generate 。因此,如果我使用的两个缓冲区都没有映射,那么错误来自哪里?glUnmapBufferglUnmapBufferARBRenderPass1glUnmapBufferThe current operation is illegal in the current state: Buffer is unbound or is already unmapped.

2012 年 8 月 19 日上午 12 点编辑:

根据我在 gDEBugger 中从 GLExpert 中得到的错误消息,似乎调用glBeginTransformFeedback导致绑定的缓冲区GL_TRANSFORM_FEEDBACK_BUFFER被映射。具体来说,当我单击“纹理、缓冲区和图像查看器”中的缓冲区时,它会输出消息The current operation is illegal in the current state: Buffer must be bound and not mapped.。但是,如果我在glBeginTransformFeedbackand之间添加这个glEndTransformFeedback

它输出 0,表示GL_TRANSFORM_FEEDBACK_BUFFER未映射。如果这个缓冲区映射到另一个绑定点,这还会返回 0 吗?为什么要glBeginTransformFeedback映射缓冲区,从而使其无法用于转换反馈?

我在这里学到的越多,我就越困惑。

2012 年 10 月 10 日编辑:

正如我在下面对 Nicol Bolas 解决方案的回复中指出的那样,我发现了问题,并且与他发现的问题相同:由于一个愚蠢的错字,我将同一个缓冲区绑定到输入和输出绑定点。

我在发布问题两周后发现了它。我曾经沮丧地放弃了一段时间,最终回来并基本上从头开始重新实现整个事情,定期比较旧的、不工作的部分和部分。当我完成后,新版本就起作用了,当我搜索出差异时,我发现我绑定了错误的缓冲区。

0 投票
1 回答
1264 浏览

vtk - vtkMarchingCubes 将 nifti 表面导出到波前 OBJ

我想在 nifti 标签集上运行 vtkMarchingCubes。我要为其生成曲面的体素区域都具有相同的值。我有两个问题。首先,我似乎错误地设置了算法,因为生成的 vtkPolyData 显然没有顶点。其次,从 vtkOBJExporter 文档中我不清楚如何将 vtkPolyData 导出为波前 .OBJ 文件。如果有人看到下面的代码有任何问题,或者可以告诉我如何将 vtkPolyData 导出为 OBJ,我将不胜感激。

0 投票
2 回答
15344 浏览

opengl - 如何插入顶点法线?

我正在尝试使用行进立方体算法使用 Gouraud 着色来渲染 3D 模型(来自 volvis.org)。到目前为止,我有每个顶点的法线:

渲染时我可以看到一个漂亮的平面阴影。现在,据我所知,我需要对这些顶点法线进行插值以在交点处找到法线以获得 Gouraud 着色。我怎样才能插入顶点法线?

0 投票
2 回答
3278 浏览

c++ - 行进立方体和八叉树有什么区别?

八叉树是行进立方体的特例吗?我的意思是八叉树是否使用与行进立方体相同的三角立方体。我知道八叉树是四叉树的 3d 形式。我只想知道我的方向是否正确。树形成后,八叉树形成三角形的步骤(用于创建表面)如何与行进立方体的步骤相同?

0 投票
1 回答
125 浏览

c++ - getdepth 函数在 MarchingCube 算法中是如何工作的?

我试图理解 Marching Cube Algorithm,所以我想我已经理解了三角形是如何形成的以及如何在每个网格中计算法线。我可以看到有一种链表结构将每个网格链接到另一个网格。但是当我遇到 GetDepth(t[m]) 单独通过每个三角形(每个网格的那些三角形) (t[0],..,..) 时,它返回节点的深度。

功能,

看起来它试图找到最大 z(是真的吗)。我可以看到它比较“>”然后我把它弄丢了。谁能解释一下这里发生了什么。