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
Graphics 两个网格,相同的纹理,不同的偏移?_Graphics_Three.js_Webgl_Textures - Fatal编程技术网

Graphics 两个网格,相同的纹理,不同的偏移?

Graphics 两个网格,相同的纹理,不同的偏移?,graphics,three.js,webgl,textures,Graphics,Three.js,Webgl,Textures,使用three.js,我在一个网页上显示一个翻转立方体(又称魔方;参见示例) 在翻转立方体上,通常会有图像分布在立方体的多个部分上。例如,上面显示的船图像分布在四个立方体的面上。在three.js术语中,有多个网格需要为其材质纹理使用相同的图像,但每个网格的偏移量不同 据我所知,在three.js中,不是材质或网格。因此,看起来不能在两个不同位置的不同偏移处使用单个纹理 这是否意味着为了在四个不同的面上显示船只图像的不同部分,我必须创建四个单独的纹理,这意味着我们将船只图像加载到内存中四次?我

使用three.js,我在一个网页上显示一个翻转立方体(又称魔方;参见示例)

在翻转立方体上,通常会有图像分布在立方体的多个部分上。例如,上面显示的船图像分布在四个立方体的面上。在three.js术语中,有多个网格需要为其材质纹理使用相同的图像,但每个网格的偏移量不同

据我所知,在three.js中,不是材质或网格。因此,看起来不能在两个不同位置的不同偏移处使用单个纹理

这是否意味着为了在四个不同的面上显示船只图像的不同部分,我必须创建四个单独的纹理,这意味着我们将船只图像加载到内存中四次?我希望不是这样

下面是一段相关的代码:

  // create an array with the textures
  var textureArray = [];
  var texNames = ['boat', 'camels', 'elephants', 'hippo',
    'natpark', 'ostrich', 'coatofarms-w', 'kenyamap-w', 'nairobi-w'];
  texNames.map(function(texName) {
    textureArray.push(THREE.ImageUtils.loadTexture(
      'images/256/' + texName + '.jpg' ));
  });

    // Create a material for each texture.
  for (var x=0; x <= 1; x++) {
    for (var y=0; y <= 1; y++) {
      for (var z=0; z <= 1; z++) {
        var materialArray = [];
        textureArray.map(function(tex) {
          // Learned: cannot set this offset for one material,
          // without it affecting all materials that use this texture.
          tex.offset.x = x * 0.2;
          tex.offset.y = y * 0.2;

          materialArray.push(new THREE.MeshBasicMaterial( { map: tex }));
        });
        var cubeMaterial = new THREE.MeshFaceMaterial(materialArray.slice(0, 6));
        var cube = new THREE.Mesh( cubeGeom, cubeMaterial );
        cube.position.set(x * 50 - 25, y * 50 - 25, z * 50 - 25);
        scene.add(cube);
      }
    }
  }
//使用纹理创建一个数组
var textureArray=[];
变量texNames=[“船”、“骆驼”、“大象”、“河马”,
“natpark”、“鸵鸟”、“Coatfarms-w”、“Kenyamp-w”、“内罗毕-w”];
map(函数(texName){
textureArray.push(三个.ImageUtils.loadTexture(
'images/256/'+texName+'.jpg');
});
//为每个纹理创建材质。

对于(var x=0;x您所说的是正确的。与其调整纹理偏移,不如调整几何体的面顶点UV

编辑:还有另一种更符合您需要的解决方案。您可以像这样克隆纹理:

var tex = new THREE.Texture.clone();
克隆纹理将导致重新使用加载的图像,并且新纹理可以有自己的偏移量。但是,在图像加载之前不要尝试克隆纹理

使用这种替代方法,您不必调整UV,也不必多次加载图像


three.js r.58

感谢您的输入。这是否意味着不同的立方体不能共享一个立方体几何体,因为不同立方体的+x面上图像的纹理偏移可能不同?您能给出(或链接到)吗如何调整几何体的面顶点UV的示例?@KevinReid:为什么这么说?@LarsH是的,你是对的。立方体将不再能够共享相同的几何体。你赢了一些,你输了一些…今天早些时候,我在three.js issues board上发布了你的问题,关于决定使用纹理的属性ins替代材料。现在它对您没有帮助,但我们将看看它会带来什么…您可能可以通过查看几何数据结构来了解如何自己设置UV。感谢您将其发布在问题板上!我将查找并跟踪该问题。
geometry.faceVertexUvs[0][faceIndex][vertex].y=0.5;