问题标签 [openvdb]

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 回答
828 浏览

c++ - OpenVDB中网格上的转换和CSG操作

OpenVDB 看起来真的很神奇,节点的寻址真的很聪明。有些操作我不明白,特别是CSG操作。这是一个示例代码。它接受两个参数作为输入:

  • 一个只有一个网格的 vdb 输入文件,表示从三角形网格开始创建的水平集,
  • 存储操作结果的 vdb 输出。

该算法应该接受输入,

  1. 在 gridA 中创建 deepCopy
  2. 在 gridB 中创建 deepCopy
  3. 沿 M_PI/4.0f 的 Y 轴旋转 gridB
  4. 在 gridA 和 gridB 之间执行 csgUnion
  5. 将所有网格保存在 vdb 输出文件中。

我正在尝试使用 VDB 网格作为数据容器来代替经典八叉树算法,用于在碰撞中需要高度详细信息的物理模拟。

我理解世界坐标和网格坐标之间转换的概念,我不明白的是如何在树内执行数据的转换,比如平移或旋转水平集,就像一个刚性对象。在这个例子中,我认为我只是在改变世界和格子之间的转换。

这是结果(水平集和体积相同):gridA 应该是原始加载的网格Initial Grid gridB 是旋转了 45 度的网格,实际上是Trasformed 网格,似乎执行了旋转...与工会的结果网格......但没有运气......没有最终结果?

你有什么建议吗?

附:一个例子和一个链接到我正在使用的LINK REMOVED(对不起,它是 133MB ......)

0 投票
1 回答
221 浏览

c++ - 如何填充给定平面内的 OpenVDB 体素?

我有一个由 4 个 (x,y,z) 点定义的四边形(就像一个有边的平面)。我有一个 OpenVDB 网格。我想用值 1 填充我的四边形(包括边缘)内的所有体素。如果不手动设置四边形(有限平面)的每个体素,这样的事情可能吗?

0 投票
2 回答
473 浏览

c++ - 函数参数没有类型

我在OpenVDB文档中遇到了以下代码:

我以前看到一个参数默认为intif 没有指定类型,但这里可能是这种情况吗?TopologyCopy在下面的 2 行中被称为操作员。

上述声明是做什么/意味着什么?

编辑:接受的答案解释了正在发生的事情。解决方案是将函数称为

0 投票
1 回答
536 浏览

c++ - 如何使用 openvdb(并行)foreach 访问多个网格?

我有一个 openvdb 网格,我想使用仿函数和 openvdb::tools::foreach 对其进行迭代。

如果只涉及 GI 的操作可以简单地调用

尽管我需要根据迭代步骤的计算值访问和修改其他网格,但在每个体素(迭代)处。

我的初始解决方案涉及向函子提供附加网格的访问器:

访问器在构造时提供给 Functor,此外并行的每个线程都提供了 functor 的副本:

不幸的是,这个解决方案不起作用,因为:

  • 访问器不能是 const 才能被访问
  • 但是 Functor::operator() 必须是一个 const 方法才能被 tools::foreach 使用

第二个肮脏的解决方案是将 Functor 访问器副本声明为可变的。由于 openvdb 断言失败(很可能是内存泄漏),此解决方案在 Debug 中不起作用。

有解决问题的方法吗?例如不需要 operator() 为 const 的 tools::foreach。

0 投票
1 回答
709 浏览

opengl - openvdb 查看器和 opengl

我正在尝试使用 OpenVDB 和查看器,我只想使用查看器查看 openvdb 文件。某些查看器的函数使用 opengl 函数并返回 opengl 错误。

下面是执行ovovdb 查看器及其错误消息。

这是 openvdb 查看器的 RenderModules 中显示错误消息的功能。我添加了一些用于调试的行。

我知道opengl错误#1281表示大小的值无效。但是,顶点的大小不是负值,其他参数对我来说也很好。

我错过了什么?

0 投票
0 回答
78 浏览

c++ - 如何在仅数据结构模式下构建 OpenVDB?

我想使用 OpenVDB 作为数据结构。我不想要任何测试或样本或 zlib。如何将 OpenVDB 配置为仅构建为数据结构?

0 投票
1 回答
869 浏览

c++ - 如何使用 OpenVDB 进行最近点查询?

首先,如何使用 openvdb 找到最近点?

其次,如果ClosestSurfacePoint是正确的方法,如何使用它?

我阅读了有关使用 OpenVDB 实现更快 NNS 的 ICP 的论文。

http://www.pmavridis.com/research/efficient_sparse_icp/

作者说他通过使用openvdb for NNS获得了进步。

而其他一些人也以类似的方式实现了同样的目标。

所以,我想自己尝试一下。

经过几次尝试,我终于编译成功了。

但是,我有点困惑。

在我看来(在阅读了包括在线食谱在内的大量文档之后)采样器似乎可以做到这一点

所以,我尝试了这些例子。

我做了如下所述的事情

对象:在网格中找到离查询点最近的点(ijk)

  1. 创建点(或加载点)并转换为 vec3d 格式
  2. 制作点索引网格。
  3. 设置查询点(ijk)
  4. 设置索引网格的访问器
  5. 点采样器()的函数调用

但是,这些示例显示 0 或 1。

如果找到完全相同的位置,则返回 1。如果没有,则返回 0。

可能,这个点采样器不是我要找的。

换个方式试试。

其他候选人是

我尝试了下面写的代码,它类似于 betajippity 的工作 https://github.com/betajippity/Ariel/blob/master/src/grid/levelset.cpp

但由于矢量而出错

最后一行

导致调试断言失败。

我不知道如何处理这些事情。

因为我无法修改openvdb的内部。我刚刚调用了函数,它出错了:(

如果您对此有任何想法,请提供帮助。

再次,问题是..

如何使用openvdb找到最近的点?

如果ClosestSurfacePoint是正确的方法,如何使用它?

我真的很感谢你提前。

0 投票
1 回答
423 浏览

graphics - 从点云创建 LevelSet

我对 OpenVDB 相当陌生。如果这个查询听起来微不足道,请提前道歉。

我想从一组无组织的数据点构造一个隐式曲面。我想知道如何使用 OpenVDB 来做到这一点。

我目前的做法如下:(这里

  1. 计算矩形网格上到任意数据集的距离函数。
  2. 找到梯度流算法的初始曲面
  3. 求解水平集函数的时间相关 PDE

我想提一下,我只是为上述三个步骤使用了一个简单的常规网格。

从代码示例创建和编写网格的示例与我想要的非常相似,只是我想用点云中的级别集替换球体的级别集。

有没有一种方法可以从tools命名空间中的实用程序构建一个级别集以从点云构建一个级别集?我认为 ParticlesToLevelSet 类似于我想做的事情。有人可以分享一个例子吗?

0 投票
0 回答
148 浏览

c++ - 计算与边界场的距离,遍历体素并访问其邻居

我正在从事一个涉及从封闭对象中提取中心线的项目。在实现中心线提取算法之前,我必须执行以下处理步骤。我是 openvdb 的新手,因此需要一些帮助。

  1. 体素化网格。
  2. 计算每个体素与边界场的距离。
  3. 迭代体素。
  4. 访问一个体素的 26 个邻居。

我的尝试

  1. 第 1 步和第 2 步 - 为了完成第 1 步和第 2 步,我执行以下操作。a) 读取波前 obj。我为此编写了一个自定义函数,用于填充 Vec3s、Vec3I 和 Vec4I 的向量。b) 将数据传递给以下函数以计算与边界场的距离。

    /li>

我是否使用正确的 api 函数来计算与边界场的距离?如果是这样,我不理解第 5 个(float exBandWidth)和第 6 个(float inBandWdth)参数。关于这些的一些指示会有所帮助。

  1. 现在我与边界字段有距离我使用值迭代器在网格上进行迭代,如下所示

    /li>

我的第一个问题是我做这一步对吗??如果是这样,我还想为每个体素访问 26 个邻居。怎么做 ??

0 投票
0 回答
98 浏览

c++ - 在 OpenVDB 中跨平面窄带水平集的插值

我知道 OpenVDB 的稀疏点云体素值插值,但我仍在学习。

我有一个三角形,我发现它相交的窄带水平的体素集。我将该级别集中的点分配给一个点组,并将值分配给该级别集中的几个点。

可以说,然后我想为该级别集中的其他点插入值。我是否必须先将这些点提取到一个单独的网格中,或者是否有某种操作只能在该水平集组中的点之间进行插值?

我问的主要原因是因为我已经为点的不同属性维护了几个网格,并且为每个三角形面创建一个单独的网格对象似乎过度。