行进立方体问题

2023-12-24

我目前正在编写一个程序来使用 C++ 和 Opengl 实现 Marching Cube。

然而,我最好的参考仅来自http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/ http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/

在网络中,提供的代码是用C编写的。
我的问题是我不理解 triTable 和 edgeTable
以及它们之间的关系。

谁能帮助我解释或指导我将算法转换为代码?


这些表用于了解如何对表面进行细分:

第一个表为您提供了插值所需的边。 第二个表为您提供了镶嵌的方式,这意味着, 你必须在立方体内部制作哪些三角形。

一个小例子:

假设,顶点 1 和 2 低于 iso 级别, 立方体索引应为 3。

整个路口应该是这样的 一个楔子。

如果您考虑一下,您必须在边缘上插入值: 0 和 9 以及 2 和 10。 如果将其输入位字段,则每个位对应于“边是否相交?”你最终会得到这样的结果:



10 9 8 7 6 5 4 3 2 1  edge
 1 1 0 0 0 0 1 0 1 0  intersected?
  

你不会吗?

这正是 EdgeTable[3] 的二进制值;) 0x30A = 1100001010

现在您可以编写一个函数来线性插值这些边缘上的点 以适合您的等水平。这些点将成为该细胞内的表面。

但如何对这个细胞/表面进行镶嵌呢?

如果您查看 triTable[3],您的脸上应该会露出微笑:)

在评论中残留困惑的陈述后添加:;-)

Marching Cubes 的作用: 想象一下你有一个黑暗的房间,里面有一个点光源。 它是标量强度值的体积光强度场的中心。 您可以转到点 (x,y,z) 并测量那里的强度,例如3坎德拉。

您现在想要通过具有特定光强度的所有点渲染表面。 您可以想象这个等值面看起来像点光源周围的球体。这就是我们希望 Marching 立方体能够为我们提供的。

现在,遍历房间中的所有点并将每个点标记为具有大致 iso 值的顶点,在算法上将非常复杂,并且会导致大量顶点。然后我们必须以某种方式对其进行细分。

因此:首先行进的立方体将整个体积分割成大小相等的立方体。 如果基础数据具有某种基础离散性,则使用其倍数。我不会讨论另一种情况,因为这种情况很少见。 例如我们将密度为1mm的网格放入2mx5mx5m的房间中

我们使用 5mmx5mmx5mm 的立方体。通过它们运行应该便宜得多。

现在您可以想象,一些立方体的边缘与等值面相交。 这些是有趣的。此代码识别它们:


cubeindex = 0;
   if (grid.val[0]   

如果立方体索引保持为零,则该特定立方体不与等值面相交。 如果cubeindex > 0,你现在知道等值面穿过这个立方体 并且您想要渲染其中的等值面部分。

请在脑海中想象一下这一点。 看http://en.wikipedia.org/wiki/Marching_cubes http://en.wikipedia.org/wiki/Marching_cubes相交立方体的示例。

您可以轻松获得的顶点是立方体边缘上的顶点。 只需在 2 个角点之间线性插值即可找到位置 的等值并在那里放置一个顶点。但哪些边相交??? 这就是edgeTable[cubeindex]中的信息。 这是包含所有 if 的一大段代码,用于存储插值 点作为 xyz 点数组中的顶点:vertlist[]。 这篇文章内容如下:



get the bitfield = edgeTable[cubeindex]
 if edge 1 is marked in bitfield (bit 1 set to 1 in bitfield)
    vertlist[0] = interpolated point, somewhere on edge 1
... and so on.
  

现在你有了一个充满顶点的数组,但是如何将它们连接到三角形呢? 这是 tritable 提供的信息。

剩下的就和我上面解释的差不多了。

如果仍然存在问题,请具体说明给您带来麻烦的代码段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

行进立方体问题 的相关文章

随机推荐

  • 将图标放置在 div 的右上角

    我创建了这段代码 但我无法将图标放在 valori 类的 div 的右上角 这里是期望的结果 这里的代码 HTML div class circletop div class numberpr 3 anno div div class lo
  • 运行 Firebase 模拟器时出现“确定执行环境时出现意外错误”

    当我部署函数时 一切正常 但使用 Firebase 模拟器在本地运行相同的代码会出现以下错误 message Unexpected error determining execution environment request to htt
  • 表单提交复选框将值设置为“on”而不是“true”

    您好 我有一个 html 表单 我通过按钮上的单击事件提交该表单 该事件触发 myform submit 问题是表单上有一个复选框 并且在发布的参数下的 firebug 中它显示 mycheckbox1 on 而不是预期的 mycheckb
  • 在嵌套元组中查找值

    假设我有 t dog Dog cat Cat fish Fish 我需要检查一个值是否位于嵌套元组的第一位 即小写位 中 我怎样才能做到这一点 大写值实际上并不重要 我只想搜索仅包含小写值的字符串 if fish in t print Fi
  • jspdf AutoTable :表格特定行的目标样式

    我正在为我的表格 pdf 使用 jsPDF AutoTable 插件 我的资料来源 javaScriptIncludeTag jspdf min js javaScriptIncludeTag jspdf plugin autotable
  • 类 CharField() 的参数

    有什么区别CharField name max length 100 and CharField max length 100 参数是什么 name 用于 什么是CharField 构造函数 有人可以给我一个链接吗 CharField 继承
  • 保持geom_rect半透明区域,但彩色轮廓

    我正在尝试使用 R 中的plotly 创建一个带有矩形的交互式绘图 我的主要想法正在发挥作用 然而 我所坚持的是允许每个矩形都有一个彩色轮廓 如数据的 填充 列中所描绘的 但是是一个完全透明的区域 以下是正在运行的 MWE library
  • 收款人不接受以该货币付款

    我正在尝试执行链式付款 其中主要收款人采用英镑 GBP 货币 我是交易的第二接收者 我的帐户设置为美元 但不阻止任何货币 如您所见 以下是确切的错误消息 接收方 不接受此货币的付款 请帮助我理解为什么会失败 我的帐户需要进行其他设置吗 我必
  • 如何找到 CUDA 的 epsilon、min 和 max 常量?

    我正在寻找 CUDA 设备的 epsilon 两个数字之间的最小步长 min 最小量值 和 max 最大量值 的值 即 FLT EPSILON DBL EPSILON FLT MIN DBL MIN 和 FLT MAX DBL MAX 中定
  • GOlang Scanf 错误

    当使用 Scanf 两次时 第一次它会获取用户输入 但第二次它不会并从函数中返回 这只是在 Windows 上运行时才会出现的问题 当我在 Mac 上运行它时 它会按预期工作 首先询问用户的用户名 然后询问他们的密码 下面是问题中的代码 我
  • Swift 可选的 inout 参数和 nil

    是否有可能有一个Optional inoutSwift 中函数的参数 我正在尝试这样做 func testFunc inout optionalParam MyClass if optionalParam 但是当我尝试调用它并通过时nil
  • swi prolog 中的优化

    假设我想找到 argmax x y z 1 2 20x 2 32xy 16y 2 2x 2y 受 x gt 0 y gt 0 z gt 0 且 x y z 0 我知道偏导数设置为 0 是 20x 16y 2 0 和 16x 16y 2 0
  • onCreate 方法内的屏幕截图在 android 中不起作用

    我正在一个 Android 应用程序中工作 我想在重写的方法 onCreate 中捕获当前活动的屏幕 当我在重写的方法 onCreate 中编写用于捕获屏幕的代码时 位图返回 null 但是 当我在同一活动中单击按钮中调用相同的代码时 位图
  • 在Container中挂载目录并与Host共享

    我以为我理解了文档 但也许我没有 我的印象是 v HOST PATH CONTAINER PATH标志是双向的 如果容器中有文件或目录 它们将被镜像到主机上 这使我们即使在删除 docker 容器后也能保留目录和文件 在官方 MySQL d
  • statsmodels wls_prediction_std 的数学背景

    wls prediction std 返回拟合模型数据的标准差和置信区间 我需要知道如何从协方差矩阵计算置信区间 我已经尝试通过查看源代码来解决这个问题 但没能做到 我希望你们中的一些人可以通过写出 wls prediction std 背
  • Android 在 addTextChangedListener (edittext) 中的某些条件下禁用肯定按钮

    这是我的对话框代码 如果编辑文本中的文本大小大于 5 我想禁用肯定按钮 如果大小 private void myDialog String title AlertDialog Builder builder new AlertDialog
  • 归档日志文件时内存不足错误

    我在运行控制台作业时遇到问题 该作业运行并创建我在午夜存档的每日日志文件 这将创建一个第二天的空白日志文件和一个存档文件 其中名称中包含昨天的日期以及旧文件的内容 用于调试我可能遇到但直到第二天才知道的问题 然而 自从我启动 BOT 的工作
  • 更改默认的 Ruby 参数

    我想更改传递给 Ruby 函数的默认参数 例如 而不是每次都写 1 2 3 do stuff option gt my option 我想修改默认值以便我可以编写 1 2 3 do stuff 更改默认参数的最简单 最干净 最像 Ruby
  • 通过 ssh 密钥访问 GitHub 组织

    也许我是瞎子 但我找不到一种方法来访问通过 SSH 密钥授予我访问权限的组织 我知道直接连接到您自己的帐户很容易 但是我该如何通过组织来做到这一点呢 您帐户的个人 SSH 密钥可识别您的 GitHub 用户 如果组织授予您访问权限 则这是通
  • 行进立方体问题

    我目前正在编写一个程序来使用 C 和 Opengl 实现 Marching Cube 然而 我最好的参考仅来自http local wasp uwa edu au pbourke geometry polygonise http local