Three.js 随机大小网格的纹理重复

Three.js 随机大小网格的纹理重复,three.js,Three.js,在three.js中我需要一些纹理方面的帮助。我有多个块,每个块都有随机的宽度/高度,我需要对它们应用相同的纹理,但沿整个块重复。正如我从其他答案中看到的,我可以使用以下代码设置纹理重复: lavaTexture.wrapS = lavaTexture.wrapT = THREE.RepeatWrapping; lavaTexture.repeat.set( 2, 2 ); 但在这种情况下,我应该手动设置纹理将重复多少次。在我的例子中,这意味着如果我想要100个随机大小的块,我应该创建200个

在three.js中我需要一些纹理方面的帮助。我有多个块,每个块都有随机的宽度/高度,我需要对它们应用相同的纹理,但沿整个块重复。正如我从其他答案中看到的,我可以使用以下代码设置纹理重复:

lavaTexture.wrapS = lavaTexture.wrapT = THREE.RepeatWrapping;
lavaTexture.repeat.set( 2, 2 );
但在这种情况下,我应该手动设置纹理将重复多少次。在我的例子中,这意味着如果我想要100个随机大小的块,我应该创建200个纹理(调用
THREE.ImageUtils.loadTexture
200次)和200个材质(MeshFaceMaterial-因为我应该为每一侧应用重复设置的纹理),这似乎对性能有不良影响

那么在three.js中处理这种情况的正确方法是什么呢?是否有类似于
自动重复
的选项,这样我就不必费心计算纹理应该重复多少时间了


离开
lavaTexture.repeat.set(1,1)并仅添加一次纹理

对于每个块,只需将UV设置为与块尺寸匹配——例如,如果块的大小为100,则将UV的范围从0到100,而不是从0到1


如果您使用的是
BoxGeometry
,则需要制作自己的副本才能启用此功能。请参见src/extras/geometrics/BoxGeometry.js,并将比例值添加到第95行左右的
uva uvb uvc uvd
值。

您可以直接将
faceVertexUvs
更改为对象的几何体。例如,如果是长方体几何体,对于每组相对面:

function setUv( v, index, wr, hr ) {
    for (var i=index*4; i<(index+1)*4; i++) {
        console.log(i);
        for (var j=0; j<3; j++) {
            v[i][j].x = v[i][j].x * wr;
            v[i][j].y = v[i][j].y * hr;         
        }
    }
}

var material = new THREE.MeshPhongMaterial( {side: THREE.FrontSide, map: texture} );

var mesh = new THREE.Mesh( new THREE.BoxGeometry(50,75,100,1,1,1), material);

var v = mesh.geometry.faceVertexUvs[0];

setUv( v, 0, 4, 3 );
setUv( v, 1, 2, 4 );
setUv( v, 2, 2, 3 );  
功能设置UV(v、索引、wr、hr){

对于(var i=index*4;我认为第一行应该是
for(var i=index*2;我想问另一个关于纹理缩放问题的问题,但这个问题在建议中突然出现了。+1对于
setUv()
函数。对其进行了修改并与
PlaneGeometry
一起使用。