【问题标题】:Add Texture to custom three.js Geometry将纹理添加到自定义 three.js 几何图形
【发布时间】:2019-08-23 00:29:04
【问题描述】:

我一直在寻找一种将 uv 映射添加到我在 three.js 中的自定义几何图形的方法。我找到了这样做的方法,但我找到的解决方案都没有。谁能解释一下 uv-mapping 的工作原理以及如何正确执行?

var s = 100;
var MapHeight = function(x, y, mult){
    var map = new Array(x);
    for(var i = 0; i < x; i++){
        map[i] = new Array(y);
        for (var j = 0; j < y; j++) {
            map[i][j] = Math.sin((i*12+j)/10)*mult;
        }
    }
    return map;
};
var heightMap = MapHeight(s, s, 0.3);
var loader = new THREE.TextureLoader();
var sandTex = loader.load("Textures/sand.jpeg");
var div = 2;
var Sand = function(color){
    var geo = new THREE.Geometry();
    var i;
    for (i = 0; i < s; i++) {
        for (var j = 0; j < s; j++) {
            geo.vertices.push(new THREE.Vector3(i/div, heightMap[i][j], j/div));
        }
    }
    for (i = 0; i < (s)*(s-1); i++) {
        if (!Number.isInteger((i+1)/s)){
            geo.faces.push(new THREE.Face3(i, i+1, i+s+1));
            geo.faces.push(new THREE.Face3(i, i+s+1, i+s));
        }
    }
    geo.computeVertexNormals();
    geo.computeFaceNormals();
    geo.center();
    var mesh = new THREE.Mesh(
        geo,
        new THREE.MeshStandardMaterial({map: map})
    );
    return mesh;
};

现在,当我尝试将 UV 映射添加到我的几何体时,结果要么是黑色材质,要么我的程序无法运行。

【问题讨论】:

    标签: javascript three.js uv-mapping


    【解决方案1】:

    必须将每个面的纹理坐标添加到第一层 UV 层。
    THREE.Geometry.faceVertexUvs

    在UV层创建和排列:

    geo.faceVertexUvs[0] = [];
    

    并为每个三角形面添加一个包含 3 个THREE.Vector2 的数组:

    geo.faceVertexUvs[0].push([
        new THREE.Vector2(u0, v1),
        new THREE.Vector2(u1, v1),
        new THREE.Vector2(u2, v2)
    ]);
    

    将其应用到您的代码中,如下所示:

    var geo = new THREE.Geometry();
    var i;
    var uv = [];
    for (i = 0; i < s; i++) {
        for (var j = 0; j < s; j++) {
            geo.vertices.push(new THREE.Vector3(i/div, heightMap[i][j], j/div));
            uv.push(new THREE.Vector2((i-1)/s, (j-1)/s));
        }
    }
    
    geo.faceVertexUvs[0] = [];
    for (i = 0; i < (s)*(s-1); i++) {
        if (!Number.isInteger((i+1)/s)){
    
            var vi = [i, i+1, i+s+1, i+s];
    
            geo.faces.push(new THREE.Face3(vi[0], vi[1], vi[2]));
            geo.faces.push(new THREE.Face3(vi[0], vi[2], vi[3]));
    
            geo.faceVertexUvs[0].push([ uv[vi[0]], uv[vi[1]], uv[vi[2]] ]);
            geo.faceVertexUvs[0].push([ uv[vi[0]], uv[vi[2]], uv[vi[3]] ]);
        }
    }
    geo.computeVertexNormals();
    geo.computeFaceNormals();
    

    【讨论】:

    • 感谢您的回答,我的纹理出现在我的自定义几何体上。但纹理显得模糊
    • @ArgentumManus 我看不到你的纹理。这是一个新方面,扩展了您最初的问题。纹理具有.minFilter.magFilter 属性。你如何创建纹理?
    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 2016-10-31
    • 2018-10-30
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2016-03-08
    • 2021-08-01
    相关资源
    最近更新 更多