3d 重用three.js网格(用于体素世界)

3d 重用three.js网格(用于体素世界),3d,three.js,voxel,3d,Three.js,Voxel,我目前第一次学习three.js和3D图形,并尝试创建一个体素引擎(想想Minecraft,Infiniminer)。我发现我的脚本占用了大量内存,但我怀疑为什么——我创建的每个块都使用一个新的网格对象,即使某些块看起来相同 我问过一些我认识的人,他们是否知道一种更节省内存的方法——他们建议为每种类型的块创建一个网格,并使用矩阵为块的每个实例转换网格(他们熟悉OpenGL,但不太熟悉three.js)。three.js是否允许这样的操作?如果是,你会怎么做?如果不是,还有其他选择吗 (到目前为止

我目前第一次学习three.js和3D图形,并尝试创建一个体素引擎(想想Minecraft,Infiniminer)。我发现我的脚本占用了大量内存,但我怀疑为什么——我创建的每个块都使用一个新的网格对象,即使某些块看起来相同

我问过一些我认识的人,他们是否知道一种更节省内存的方法——他们建议为每种类型的块创建一个网格,并使用矩阵为块的每个实例转换网格(他们熟悉OpenGL,但不太熟悉three.js)。three.js是否允许这样的操作?如果是,你会怎么做?如果不是,还有其他选择吗


(到目前为止,我的理解是,要渲染的每个项目都需要在场景图中,因此,即使多个块看起来相同,也需要在图中添加多个块副本(具有不同的x、y、z坐标)。我可能错了。)

我相信他们已经完成了你在three.js轨迹球控件中提出的要求


如果您在查看源代码时遇到问题,请使用键盘快捷键cntrl+u(windows)

早安,只是为了澄清一下。Three.js是WebGL API的包装器,它是OpenGL ES 2.0的一个子集,没有扩展。因此OpenGL相关知识在这里适用于某一点,您只需要通过Three.js源代码从高到低进行工作

现在,拥有一组基本对象,然后克隆和重新定位它们的想法是正确的。有一个
clone()
函数,本质上就是为您创建一个全新的对象,就像创建新网格一样,但在运行时更容易访问


如果我可以提供一些建议,看看一些代码可以帮助我们为您的用例找到更精确的优化。也许您有一些调用可以/应该被推到init阶段,也许内存正在其他地方泄漏?另外,如果可以在代码或3D建模程序中保持静态,则可以考虑合并一些几何体。这不会显著减少多边形计数,但肯定有助于简化场景

根据第92行的外观,我认为每个金字塔都是它自己的网格对象。。。(“新建”三个网格(几何体、材质))是的,你说得对,他们在那句话中似乎创建了500个三角形(感谢您的回复-我查看了clone(),但我认为创建新对象不起作用。我目前的进展是-大部分相关代码都在world.js和blocks.js中。我目前正在合并我的一些块几何体,但因为播放器需要能够编辑环境,所以单个块本身也会被存储(因此需要考虑内存问题)。请检查