Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用平面几何体具有多个纹理的Three.js平铺_Javascript_Three.js_Textures_Tile - Fatal编程技术网

Javascript 使用平面几何体具有多个纹理的Three.js平铺

Javascript 使用平面几何体具有多个纹理的Three.js平铺,javascript,three.js,textures,tile,Javascript,Three.js,Textures,Tile,所以我正在尝试建立一个由瓷砖组成的基于3D的世界 我已经成功地使用平面几何和高度值等来实现这一点,但现在我已经到了一个可能需要改变一切的地步 问题是我希望平铺具有多个纹理(使用着色器是因为我想混合它们)。我能够在全局范围内完成这项工作(因此每个瓷砖都有相同的纹理+使用一些uv贴图) 但是,我无法理解如何指定哪个平铺具有哪些纹理(我有大约100个纹理),因为平面几何体只有1个着色器材质。我也不确定通过着色器发送100个纹理是否是个好主意 所以我的问题基本上可以归结为: 有没有合适的/性能良好的方法

所以我正在尝试建立一个由瓷砖组成的基于3D的世界

我已经成功地使用平面几何和高度值等来实现这一点,但现在我已经到了一个可能需要改变一切的地步

问题是我希望平铺具有多个纹理(使用着色器是因为我想混合它们)。我能够在全局范围内完成这项工作(因此每个瓷砖都有相同的纹理+使用一些uv贴图)

但是,我无法理解如何指定哪个平铺具有哪些纹理(我有大约100个纹理),因为平面几何体只有1个着色器材质。我也不确定通过着色器发送100个纹理是否是个好主意

所以我的问题基本上可以归结为:

有没有合适的/性能良好的方法将平铺/顶点链接到纹理,这样我就可以保留平面几何体

-如果是:如何

-如果否:是否应分别创建每个平铺(因此为1x1平面)并以某种方式将它们合并在一起(性能/顶点混合?),使其充当单个平面(在本例中,合并的平面由多个1x1平面组成)并使用每个平铺的着色器(1x1平面)

这些事情通常是怎么做的

编辑: 一些额外的信息,因为我的问题似乎不太清楚:

我想要的是,一块瓷砖(两个面)有多个“材质索引”可以这么说。目前,我需要有1个平铺才能有3个纹理,所以我可以在着色器中使用特定算法混合它们


例如,我想要一个心形(红色心形/黑色背景)作为纹理,而不是基于我想要混合/更改其他两种纹理的颜色,这样我可以得到例如木制心形和蓝色背景。例如,我应该能够在正方形上均匀混合4种纹理,每种纹理取正方形的1/4。但这里的重点不是如何处理纹理,而是如何为我的面/瓷砖指定这样的3、4或更多纹理。

我想你必须看看所谓的多材质对象

THREE.SceneUtils.createMultiMaterialObject( geometry, materials );
如果你在谷歌上搜索这些,你会发现几个例子。喜欢


或者看看。可以使用它为同一几何图形指定多个材质

var mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
其中材质是一组材质,面使用
materialIndex
参数指定正确的材质

类似的问题和建议


编辑:
证明这是可能的。我使用了其中一个链接中的代码。

如果纹理大小相同,可以执行以下操作:

  • 创建一个10倍于单个纹理大小的纹理(您可以自动执行此操作,创建画布,在画布上以正确的坐标绘制纹理文件,从画布获取纹理)。这允许使用100(10x10)个纹理

  • 为瓷砖指定范围为0-0.1的基础uv坐标(因为单个纹理占据全局纹理的1/10)

  • 将单个纹理的偏移量添加到先前的uv值中(对于第二个纹理,偏移量为0.1 in u和0 in v,对于第三个纹理,偏移量为0.2和0;对于第十个纹理,偏移量为0和0.1)


  • 我认为它们都帮不了我。我需要知道的是,我如何才能说哪个瓷砖在64*64瓷砖的平面上有哪些纹理。所以我只有一个着色器需要传递属性?告诉着色器哪些瓷砖/顶点有哪些纹理,但我不知道如何做,或者这是否可能。也许我需要拆分t他在多架1x1飞机上驾驶飞机?@captain显然,我添加了一把小提琴来向您展示这是可能的。您必须使用
    materialIndex
    属性来指定您脸上的材质。您好,谢谢您的努力,尽管我认为您没有正确理解我。我想要的是一块瓷砖(2面)有多个MaterialIndex可以这么说。目前我需要1个平铺才能有3个纹理,这样我就可以用特定的算法将它们混合到着色器中。例如,我想要一个心形(红色心形/黑色背景)作为纹理,而不是基于它的颜色,我想混合/更改其他2种纹理,以便获得例如木心和蓝色背景。或者,例如,我应该能够在正方形上均匀混合4种纹理,每种纹理取正方形的1/4。但这里的重点不是如何处理纹理,而是如何指定这样的3,4,。。无论我的面/瓷砖的纹理是什么,谢谢。这将是一个好主意,因此我不必向着色器发送100个纹理。但是,我仍然需要知道哪些面/顶点/xy具有哪些纹理…:)因为您只需要3个纹理,一个可行的解决方案是使用面颜色,然后使用r分量对第一个纹理进行编码,g分量对第二个纹理进行编码,b分量对第三个纹理进行编码,这是一种选择,但这似乎是一种技巧,而不是一般的方法:)