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 Tile纹理在Three.js中_Javascript_Three.js - Fatal编程技术网

Javascript Tile纹理在Three.js中

Javascript Tile纹理在Three.js中,javascript,three.js,Javascript,Three.js,您好,我已经为我的3D对象创建了简单的渲染器(php生成) 我成功地渲染了所有对象,但是我在纹理方面遇到了一些大问题 这是我的纹理:(512x512) 我想在我的对象上使用它,但实际情况如下: 我不知道如何以1:1的比例显示未拉伸的外观良好的网格 我想我需要计算一下重复次数。有什么想法吗 这是我设置纹理的方式: var texture = THREE.ImageUtils.loadTexture(basePath + '/images/textures/dt.jpg', new

您好,我已经为我的3D对象创建了简单的渲染器(php生成)

我成功地渲染了所有对象,但是我在纹理方面遇到了一些大问题

这是我的纹理:(512x512)

我想在我的对象上使用它,但实际情况如下:

我不知道如何以1:1的比例显示未拉伸的外观良好的网格

我想我需要计算一下重复次数。有什么想法吗

这是我设置纹理的方式:

var texture = THREE.ImageUtils.loadTexture(basePath + '/images/textures/dt.jpg', new         THREE.UVMapping());
texture.wrapT = THREE.RepeatWrapping;
texture.wrapS = THREE.RepeatWrapping;
texture.repeat.set(1,1);
stairmaterials[0] = new THREE.MeshBasicMaterial(
    {
        side: THREE.DoubleSide,
        map: texture
    });
我试图改变重复值以达到1:1的不拉伸比例,但根本没有成功。我的情况越来越糟

我还使用以下算法计算顶点UV:

geom.computeBoundingBox();

var max = geom.boundingBox.max;
var min = geom.boundingBox.min;

var offset = new THREE.Vector2(0 - min.x, 0 - min.z);
var range = new THREE.Vector2(max.x - min.x, max.z - min.z);

geom.faceVertexUvs[0] = [];
var faces = geom.faces;

for (i = 0; i < geom.faces.length; i++) {

    var v1 = geom.vertices[faces[i].a];
    var v2 = geom.vertices[faces[i].b];
    var v3 = geom.vertices[faces[i].c];

    geom.faceVertexUvs[0].push([
        new THREE.Vector2(( v1.x + offset.x ) / range.x, ( v1.z + offset.z ) / range.z),
        new THREE.Vector2(( v2.x + offset.x ) / range.x, ( v2.z + offset.z ) / range.z),
        new THREE.Vector2(( v3.x + offset.x ) / range.x, ( v3.z + offset.z ) / range.z)
    ]);

}

geom.uvsNeedUpdate = true;
geom.computeBoundingBox();
var max=geom.boundingBox.max;
var min=geom.boundingBox.min;
var偏移=新的三矢量2(0-min.x,0-min.z);
var范围=新的三个矢量2(最大x-最小x,最大z-最小z);
geom.faceVertexUvs[0]=[];
变量面=几何面;
对于(i=0;i
是否导入或生成网格

您正在迭代每个三角形,并进行某种缩放/投影。如果所有这些长方体都是单个网格,这将在一定程度上起作用,您将按相同的比例缩放每个长方体。它们也存在于同一个模型空间中,因此是的,它将被正确缩放和对齐

如果它们不是相同的网格,则可能会失败

正在循环的顶点存在于模型空间中。这些盒子中的每一个,都可能以自己的规模存在,在自己的任意局部位置。因此,您必须使用对象的.modelMatrix将它们转换为世界空间。应用此矩阵时,将所有这些顶点带到同一空间中。尝试在没有边界框的情况下执行此操作,或者仅从一个对象抓取边界框,您将看到均匀的比例和正确的对齐


您将无法使用此算法以3d方式显示地图,但您正在进行2d投影。您可以检查每个三角形的方向,然后选择不同的投影方向。

您的UV可以大于1——它们将仅包裹。考虑设置你的UVS与每个脸部的尺寸。这样就不会有拉伸。然后使用
纹理。重复
放大纹理。谢谢。我会尝试,但我不确定我是否理解“考虑将UV设置为与每个面的尺寸成比例。这样就不会拉伸。”正确。例如,如果大小为宽度x高度的矩形面由两个三角形组成,则一个三角形的UV可能是(0,0)、(宽度,0)和(宽度,高度)。