【问题标题】:THREE.js Geometry map does not appearTHREE.js 几何图不出现
【发布时间】:2018-08-10 18:29:32
【问题描述】:

在我在自定义几何图形上加载图像地图之后, 它代表上图中棕色的几何形状:

var aqua_ground_geo = new THREE.Geometry();

var top0 = new THREE.Vector3(aqua_ground_geo_x_NEG, user_data['aqua_soil_calc_b_y'], aqua_ground_geo_z_NEG);
var top1 = new THREE.Vector3(aqua_ground_geo_x_POS, user_data['aqua_soil_calc_b_y'], aqua_ground_geo_z_NEG);
var top2 = new THREE.Vector3(aqua_ground_geo_x_NEG, user_data['aqua_soil_calc_f_y'], aqua_ground_geo_z_POS);

aqua_ground_geo.vertices.push(top0);
aqua_ground_geo.vertices.push(top1);
aqua_ground_geo.vertices.push(top2);

aqua_ground_geo.faces.push( new THREE.Face3(0,1,2) );

aqua_ground_geo.computeFaceNormals();
aqua_ground_geo.computeVertexNormals();

var textureUrl = "http://www.lifeguider.de/wp-content/uploads/aquag/bodengrund/dennerle_kies_naturweiss_1-2mm.jpg";
var aqua_bodengrund_tex = new THREE.TextureLoader().load( textureUrl );
var aqua_bodengrund_mat = new THREE.MeshLambertMaterial( {
    map: aqua_bodengrund_tex,
    color: 0xffffff,
} );
aqua_bodengrund_mat.shading = THREE.FlatShading;
aqua_bodengrund_mat.side = THREE.DoubleSide;

var aqua_bodengrund = new THREE.Mesh( aqua_ground_geo,aqua_bodengrund_mat);

在一个简单的THREE.BoxGeometry 上,使用相同的材​​料(它代表上图中的立方体)可以按预期工作:

var lala = new THREE.BoxGeometry( 100, 100, 100 );
var lala2 = new THREE.Mesh( lala,aqua_bodengrund_mat);

我不是 3D 专家,我的代码中缺少什么可以正确显示图像纹理?

【问题讨论】:

    标签: javascript three.js texture-mapping


    【解决方案1】:

    您需要在THREE.TextureLoader 的回调中应用纹理。还要检查文档 here;第二个参数 (onLoad) 是回调。

    var textureUrl = "https://raw.githubusercontent.com/mrdoob/three.js/master/examples/textures/crate.gif";
    var aqua_bodengrund_mat = new THREE.MeshLambertMaterial( {
        color: 0xffffff
    });
    var onLoad = function( texture ){
        aqua_bodengrund_mat.map = texture;
        aqua_bodengrund_mat.needsUpdate = true;
    }
    var loader = new THREE.TextureLoader();
    loader.load( textureUrl, onLoad );
    

    请参阅 this fiddle 了解演示。


    更新

    如果您有自定义几何体,您还需要计算 UV 以正确显示纹理。我用this answer here在另一个fiddle here

    中计算它们

    注意。我小提琴中的 UV 是针对 XY 平面中的面计算的,如果您的面在另一个平面上,则必须相应地更新...

    【讨论】:

    • 感谢您的回复。我刚刚设置了小提琴的副本。我刚刚用THREE.Geometry(); 替换了THREE.BoxGeometry();,并添加了我已经使用过的示例代码,纹理贴图再次停止工作。 fiddle
    • 好吧,需要 UV 坐标的想法是我最初问题中的最后一句话,由于一些错字调整而被删除......最后你给了我成功的答案。所以,非常感谢,威尔特!
    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 2016-07-31
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多