问题标签 [voxels]

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 投票
0 回答
311 浏览

raycasting - 是否可以将地形渲染算法从翻转码转换为“全 3d”渲染器?

我找到了这个(http://www.flipcode.com/voxtut/)基于体素技术的地形渲染算法示例,并将其转换为“全3d”渲染器。我的意思是,在高度图中,一对 (x,y) 只有一个 z(up) 坐标,而在“真实 3d”中则有很多。

我通过向普通 x,y 地图添加新的“z”层来做到这一点。例如,我有一个数据集:

这意味着,坐标为 x、y、z 的可见体素,其中 0<=z<=10 或 50<=z<=100。因此,我以与 Flipcode 上描述的相似的方式绘制此数据集。

是我的程序(很慢),是最终渲染。

我对这种方法有一些问题。

  1. 在该算法中,对象由平行于屏幕的长条纹绘制(因为我们通过将水平屏幕坐标加 1 并将相机与射线上的点之间的距离加常数 dd 来穿过屏幕)。我们在可绘制对象之间有空间的地方,也有这些丑陋的锯齿形。我可以用其他东西(例如立方体)而不是这些条纹轻松绘制对象吗?或者也许还有另一种方法可以提高质量?

  2. 由于光线不会在屏幕上绘制列(而是绘制垂直线段),因此很难确定屏幕上哪些像素已经绘制,哪些尚未绘制。有什么关系吗?

有没有关于这个主题的论文或描述的任何现成算法?

0 投票
0 回答
552 浏览

voxel - 具有实例化对象的场景的体素化

我在directx11 中创建了一个简单的场景,它有一个平面作为地板,有几个球体、立方体和矩形墙。只加载了 3 个对象:平面、立方体和球体;但是立方体和球体被多次实例化,具有不同的缩放、位置和旋转。其中两个对象是动态的。

考虑到具有不同比例和旋转的对象实例,我想将整个场景(100x100x20 单位)体素化为 0.2 单位体素。

我已经阅读了几篇关于体素化的文章,并获得了来自 GPU Pro 3 的“Practical Binary Surface and Solid Voxelization with Direct3D 11”的源代码;但是所有这些文章都展示了单个对象的体素化——将它们的三角形分割成一个网格。

我将如何扩展这些方法以解决具有多个对象实例的整个场景?

我唯一能想到的就是我必须对整个场景进行自上而下的八叉树划分。但对于动态场景,这会不会太贵?

对于我的场景,我为每个加载的模型使用一个缓冲区,所以如果我要在计算着色器中进行体素化,我是否需要将所有三个缓冲区复制到一个缓冲区中?我如何考虑模型实例?

谢谢你。

0 投票
1 回答
934 浏览

opengl - 为访问体素的多个线程获取唯一的缓冲区索引

我正在尝试实现“用于实时全局照明的基于八叉树的稀疏体素化”的一部分。

基本上只是体素化,我已经完成了。

还有“Voxel-fragment list”构造,它基本上是几个预先分配的体素位置和属性的缓冲区。

使用原子计数器和 atomic-comp-swap 或 atomic-add 创建位置缓冲区非常容易,以确保它仅由一个线程写入

但是,在多个线程写入相同体素位置的情况下,如何确保所有线程都获得适当的索引?如上所示,正确的索引仅对 1 个线程有效。

像下面的东西

我已经尝试了很多不同的方法。论文中唯一的提示是

为了管理(体素片段)列表,我们将下一个可用条目的索引(也是列表中体素片段数量的计数器)存储为另一个缓冲区对象中的单个 32 位值。

听起来它只是描述原子计数器的缓冲区对象。为了保持简单(目前),我没有计算运行平均值(如论文中所述),只是在渲染时将颜色相加并除以访问计数。

0 投票
1 回答
457 浏览

3d - 3D 凸包内的体素

我有一个值体素的三次矩阵1(其余的是0)。我需要一个相同大小的矩阵,其中凸包内的体素都是有价值的1。我看过一个类似的例子并对其进行了修改:如果我对以下内容执行操作,那会起作用吗?

% im3D 是一个零和一的三次矩阵

第二个问题:凸包内的体素应该都是连接的吧?那么为什么下面的函数给了我两个连接的对象......欧几里得或曼哈顿式/八角形?

0 投票
2 回答
1911 浏览

javascript - 使用体素生成球体

我一直在玩voxeljs,我是 3D 编程新手,它在文档中说这段代码生成了“球体世界”:

这实际上是如何生成一个球体的?从我的简单理解来看,我认为它基本上是“循环”通过 3D 世界中的每个“块”?任何进一步的解释或指向一个好的教程都会有很大的帮助!

0 投票
1 回答
1944 浏览

c++ - 哪个库用于体素数据结构?

我在科学环境中使用具有大型体素网格的 C++ 工作,我正在尝试决定使用哪个库。只有一小部分体素网格保存值 - 但每个体素(例如结构)可能有几个值,这些值由光线跟踪确定。我不想渲染任何东西,但我必须确定穿过整个目标区域的潜在光线数量,因此必须计算大量的光线盒计算,并且最好非常快......

到目前为止,我发现

后者更有吸引力,因为它看起来更简单/更容易使用。

我的问题是:如果将它们中的哪一个用于不针对渲染/可视化的任务中,它们中的哪一个会更适合?在计算大量光线盒交点(不可能进行视点相关剔除)时,哪一个更快/更好?建议,有人吗?

无论如何,我想使用现有的 C++ 库而不是自己编写 kdTree/Octree 等。没有时间重新发明轮子。

0 投票
3 回答
1324 浏览

c++ - 3D 空间中的体素唯一 ID

我正在寻找一种方法来收集一组体素。体素是一个 3D 单元,可以是完整的/空的/未知的,并且建立在点云之上(用于数据缩减)。一旦构建的体素集合永远不会被修改(每轮销毁和重建),但需要不同类型的访问(邻域,迭代所有,直接)。体素空间非常稀疏,在空间中可能有 1.000.000 个体素无序,最多仅使用 1000 个。

所以我决定使用(因为使用 c++ 后无序)hashmap 以体素 ID 作为键来收集它们(我认为八叉树是一种过度杀伤力)。现在我需要一个函数来以两种方式将 3D 点转换为体素 ID,并将 ID 转换为体素 3D 点质心。

我发现困难的是一种非常快速的方法,我希望将它们键为单个 int 值,例如:

但是对于双射函数,我不能很快想出任何东西(至于以前的演员表等,我不喜欢必须经常使用的函数(200FPS x ~1000 x 3))。

所以:

  • hashmap 是一个好的数据结构吗(让我担心的是邻域搜索)
  • 什么可以是 A-BIJECTIVE-FUNCTION 或整个函数的函数

谢谢。

0 投票
1 回答
112 浏览

c# - 从表示三维网格的一维数组中复制一行值

所以我有一个代表游戏世界的 3D 数字网格的 1D 数组,我访问单个条目(X,Y,Z),如下所示:

有没有一种方法可以在不循环的情况下复制一整行(例如,(1,1)的所有 Z 值)(我已经遍历每个条目。我想通过检查空行来节省性能(所有0s)并跳过处理它们)?如果可能的话,我宁愿不使用锯齿状数组。

0 投票
1 回答
439 浏览

javascript - 体素世界中的“剔除”

我有一个充满体素的世界,可以说我的世界是 320*320*96 体素。我的想法是将整个世界加载到我的视频卡的内存中,这样在将新“块”传输到 GPU 时不会损失任何性能。为显示体素世界而生成的面数应该很容易适应现代显卡的内存。

但是,我现在面临的问题是如何不显示该世界的某些部分,我想将这个世界的视图限制为(例如)128*128*96 并移动世界或相机以显示不同的部分。

为了演示我的问题,请看一个(简单)场景,该场景由白色的“可视”区域组成,我正在寻找正确的 WebGL/three.js 函数来将视图限制在白色部分。

体素世界

0 投票
2 回答
816 浏览

opengl - 某种边缘照明?

我正在玩弄点亮一个立方体。我还不确定我想要什么,所以我只是把它扔在那里。这就是我所拥有的...

...但我不喜欢锋利的边缘。移除照明显然意味着你再也看不到边缘了......

...这不好,因为您仍然需要能够识别立方体的面。

我想我正在寻找一种在面部之间平滑过渡的照明,看起来不太刺眼,但仍能让您将物体识别为立方体。目前,镶嵌边缘并不是一个真正的选择。有人做过类似的事情吗?

更新:唉,我对@Jherico 的评论回复太长了,所以在这里添加更新。

目前我还没有真正的着色器,因为我刚刚开始这样做。我在 Photoshop 中玩耍,看看模糊边缘会是什么样子,或者添加一个薄高光以某种方式减弱它。我想我真正想要的只是摆脱严酷的边缘外观。

我正在研究电影业是否有任何技巧,甚至研究高质量渲染使用哪些技术来柔化边缘。或者也许考虑使用边缘照明之类的东西来让你的注意力从锐角上移开。我会图像镶嵌可以帮助很多,但理想情况下,我想要一种更便宜的技术,可以在低规格硬件上使用。