问题标签 [voxel]
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.
c++ - 简单的气体/流体动力学源代码
我有一个体素对象的 3D 矩阵,我想用它来存储一些基本物理原理的状态。这里的目的是在视频游戏中实时表示体积(~30FPS)。我想尝试拥有以下容量: 1. 存储各种重量的流体和气体类型,并遵循基本的相互作用原则。例如,氧气比水轻。2.能够判断压力。3. 能够与“实体”对象进行交互。所以一个空心的 3D 盒子可以存储不会“泄漏”出来的东西。
所有这些都是非常基本的,可以放弃任何“准确性”测试。
乐于接受想法以及任何体面的资源以供进一步阅读。然而,我会假设我不相信我有能力拿论文或高级方程式来滚动我自己的图书馆。
3d - 如何使用八叉树数据结构查找相邻/相邻立方体?
我为封闭曲面创建了一个边界八叉树。所有包含曲面的八叉树立方体都被划分为同一级别。所以所有叶子节点的大小都是一样的。我需要帮助找出每个终端立方体的邻居。我尝试参考不同的论文,但无法弄清楚如何在 Matlab 中实际实现它。现在,我将所有终端立方体视为体素立方体(不使用八叉树数据结构),并使用蛮力找出 26 个可能的邻居中的哪些在构成表面的立方体列表中。获得输出需要很长时间。我是编程新手,所以如果有人能提出更有效地找到叶节点邻居的方法以及如何通过在 matlab 中编码来实现该方法,我将不胜感激。谢谢!!
directx - 在 Minecraft 风格的地形中处理块 (d3d/c++)
在由数千个立方体(即 Minecraft)组成的 3d 地形中,在位置和渲染方面处理每个块的方法是什么?更具体地说,我知道在 DirectX 9 中绘制一个立方体的基元并对其进行世界变换可能是一种荒谬的方式来实现这一点,因为存在很多性能问题,所以我想知道更合理的方法是什么。
每个立方体应该是一个多次复制的网格,还是它们是一种从顶点缓冲区中的数据创建适当网格的方法?
我发现这篇文章介绍了实现我想要实现的东西背后的一些理论,但我以前从未使用过八叉树,所以我无法从源代码中获取太多内容。如果八叉树确实是要走的路,那么学习它们的好起点在哪里?我的大部分谷歌搜索只找到了关于理论的博客文章,很少或没有实现示例。
似乎使用体素在这样做时会很有用,但就像使用八叉树一样,我在这里没有经验,所以我真的不知道首先要学习什么。
无论如何,感谢您提供的任何建议\资源\书名。我确信这很明显,但我对 3d 编程还是很陌生,所以我很感谢你的帮助。
raytracing - Skewed:基于 CPU 的简单体素 raycaster/raytracer 中的旋转相机
我正在尝试编写一个简单的体素 raycaster 作为学习练习。现在这纯粹是基于 CPU 的,直到我弄清楚事情是如何工作的——现在,OpenGL 只是(ab)用于尽可能频繁地将生成的位图 blit 到屏幕上。
现在我已经到了透视投影相机可以在世界中移动的地步,我可以渲染(主要是减去一些需要调查的人工制品)透视正确的“世界”3维视图,它基本上是空的,但包含斯坦福兔子的体素立方体。
所以我有一个相机,我可以上下移动,左右扫视和“向前/向后走”——到目前为止所有轴对齐,没有相机旋转。这就是我的问题。
屏幕截图:(1) 射线投射体素同时... ...(2) 相机保持... ...(3) 严格轴对齐。
现在我已经有几天试图让轮换工作了。理论上,矩阵和 3D 旋转背后的基本逻辑和理论对我来说非常清楚。然而,当相机旋转时,我只实现了“2.5 渲染”......鱼眼,有点像谷歌街景:即使我有一个体积世界表示,看起来 - 无论我尝试什么 - 就像我将首先从“前视图”创建一个渲染,然后根据相机旋转旋转该平面渲染。不用说,我现在知道旋转光线不是特别必要且容易出错。
尽管如此,在我最近的设置中,使用最简化的光线投射光线位置和方向算法,我的旋转仍然会产生相同的鱼眼平面渲染旋转样式外观:
相机“向右旋转了 39 度” ——请注意屏幕 #2 中立方体的蓝色阴影左侧在此旋转中是如何不可见的,但现在“它确实应该”!
现在我当然知道了这一点:在一个简单的轴对齐无旋转设置中,就像我在开始时所做的那样,光线只是以小步长穿过正 z 方向,向左或向右和顶部发散或底部仅取决于像素位置和投影矩阵。当我“向右或向左旋转相机”时——即我围绕 Y 轴旋转它——这些步骤应该简单地通过适当的旋转矩阵进行转换,对吗?因此,对于向前遍历,Z 步越小,凸轮旋转得越多,偏移量为 X 步中的“增加”。然而,对于基于像素位置的水平+垂直发散,需要将 x 步的增加部分“添加”到 z 步。不知何故,我试验过的许多矩阵都没有,
这是我的基本每射线预遍历算法——Go 中的语法,但将其作为伪代码:
- fx和fy:像素位置 x 和 y
- rayPos : vec3 表示世界空间中的光线起始位置(计算如下)
- rayDir : vec3,用于在光线遍历期间的每个步骤中将 xyz 步骤添加到 rayPos
- rayStep : 一个临时的 vec3
- camPos : vec3 用于世界空间中的相机位置
- camRad : vec3 用于以弧度为单位的相机旋转
- pmat : 典型的透视投影矩阵
算法/伪代码:
我跳过了遍历和采样部分——根据屏幕 #1 到 #3,这些部分“基本上是正确的”(虽然不漂亮)——当轴对齐/未旋转时。
java - 如何在 3D 世界中创建块?
我正在研究基于体素的游戏引擎,其中我需要有块。我试图从 minecraft 中阅读 Chunk 类,但我无法理解。我的意思是块:16x16x256 块数组
所以我的问题是:块如何工作以及它如何存储数据?
java - 如何停止渲染不可见的面孔
我正在制作一个基于体素的游戏,为了它的需要,我正在创建一个块渲染引擎。
重点是,我需要生成很多立方体。每次我渲染超过 16x16x16 块的这些块时,我的 FPS 几乎不会下降,因为它渲染了所有这些立方体的所有 6 个面。那是 24 576 个四边形,我不想要那个。
所以,我的问题是,如何停止渲染不可见的顶点(或四边形),从而提高我的游戏性能?
这是用于渲染块的类:
这是呈现它们的代码:
algorithm - Ray - 八叉树相交算法
我正在寻找一种好的光线八叉树交集算法,它可以让我以迭代的方式获得光线穿过的叶子。我计划在 CPU 上实现它,因为我还不想深入研究 CUDA :)
目前,我的 Voxel raycaster 只是在 XxYxZ 体素的非分层阵列上执行 3D DDA(Amanatides/Woo 版本)。您可以想象,当有很多空白空间时,这会非常昂贵,如下图所示(更亮的红色 = 更多工作 :)):
我已经发现这个任务有两种算法:bottom-up,从叶子向上工作,top-down,基本上是深度优先搜索。
我已经找到了 Revelles 从 2000 年开始的算法,称为An Effective parametric algorithm for octree traversal,看起来很有趣,但已经很老了。这是一种自上而下的算法。
最流行的自下而上方法似乎是K. Sung,A DDA Octtree Traversal Algorithm for Ray Tracing,Eurographics'91,North Holland-Elsevier,ISBN 0444 89096 3,p。73-85。问题是大多数 DDA 八叉树遍历算法都期望八叉树具有相同的深度,这是我不想要的 - 空子树应该只是一个空指针或类似的东西。
在最近关于稀疏体素八叉树的文献中,我设法通读了(最值得注意的是莱恩关于 SVO 的工作,它们似乎都基于某种 GPU 实现的 DDA 版本(Amanatides/Woo 风格)。
现在,这是我的问题:有没有人有实现基本的、简洁的光线八叉树相交算法的经验?你会推荐什么?
java - 如何加速沙盒 lwjgl 游戏?
我正在尝试制作一个沙盒(体素)开放世界游戏。我的游戏使用称为块的 32x32x32 块集来存储块数据,每个块都有 4 个 VBO:顶点、原色、次要颜色、纹理坐标。这些 VBO 存储在此类中:
它扩展了 ImmediateModeRenderer:
从世界类调用开始和停止的静态方法,以准备绘制块并完成绘制块。
编辑:问题已解决!不要在 VBO 中使用双打,使用浮点数!
java - 3D 体素角度平面
我正在尝试从体素中绘制一个平面,目标是填充它,但我遇到了很多麻烦。我尝试的一切都会导致表面出现孔洞。表面有 4 个角,但我也希望能够对三角形使用相同的方法。
这是我尝试过的:
- 从平行的一侧拉到另一侧
- 仅沿平面的一侧在一个方向(z 方向)上绘制
我在 2 上取得了最大的成功,但是当我在飞机上添加任何俯仰或滚动(存在任何高度)时它失败了。
有小费吗?没有代码,因为我确信我的实现都是正确的,只是算法的选择是错误的。
编辑:
附带说明一下,虽然 2 号的孔较少,但平面变形并且看起来不平坦。
编辑2:
我坚持我的第一个决定,但现在的问题是,我如何检测何时会有漏洞?通过观察,我注意到每个平面的孔数量相同,无论俯仰和滚动如何。Yaw是这里的罪魁祸首。
编辑3:
我把这个问题留了下来,但我决定只测试附近的一个街区,看看它是否是空的。我不想这样做,但是是的。如果您有更优雅的解决方案,我会全力以赴。