纹理在立方体球形上的THREE.js

时间:2018-01-23 13:26:12

标签: javascript three.js textures cube

我试图纹理立方体球体,立方体变成具有this gnomic投影的球体,现在我试图用perlin噪声生成的单个正方形或矩形纹理来纹理化它。 this

接下来我尝试使用来自codepen的this uv映射代码,但是在后面留下了一个接缝。 here

我认为,我需要的是来自this问题的球形映射响应,但我不确定如何应用它,我试图像this问题那样使用它:

function assignUVs3(geometry) {

    geometry.faceVertexUvs[0] = [];

    geometry.faces.forEach(function(face) {

        var uvs = [];
        var ids = [ 'a', 'b', 'c'];
        for( var i = 0; i < ids.length; i++ ) {
            var vertex = geometry.vertices[ face[ ids[ i ] ] ].clone();

            var n = vertex.normalize();
            var u = .5 - Math.atan( n.z, - n.x ) / ( 2.0 * Math.PI );
            var v = .5 - Math.asin( n.y ) / Math.PI;
            uvs.push( new THREE.Vector2( u, v ) );
        }
        geometry.faceVertexUvs[ 0 ].push( uvs );
    });

    geometry.uvsNeedUpdate = true;
}

但是给了它这个奇怪的拉伸外观image3

我的逻辑错了吗?有没有更容易的方法将方形或矩形纹理应用到cubephere?,我实时创建纹理,所以做一些纹理本身的额外工作实际上不是一个选项,因为我不是计算机图形专业,我不是真的准备去了着色器级别。

任何人都可以看到一个更好的解决方案,或者指出一些有助于我的阅读材料,非常感谢你。

编辑: 好吧,有点解决,而不是我的问题,函数有一个错误,并根据此Sphere UV Mapping guide修复它。

现在功能如下:

function assignUV(geometry) { 
    geometry.faceVertexUvs[0] = []; 
    geometry.faces.forEach(function(face) { 
       var uvs = [];
       var ids = [ 'a', 'b', 'c'];
       for( var i = 0; i < ids.length; i++ ) {
           var vertex = geometry.vertices[ face[ ids[ i ] ] ].clone();
           var n = vertex.normalize();
           var u =  .5 + Math.atan2( n.z, - n.x ) / ( 2.0 * Math.PI ) ;
           var v =  .5 - Math.asin(n.y) / Math.PI ;
           uvs.push( new THREE.Vector2( u, v ) );
       }
       geometry.faceVertexUvs[ 0 ].push( uvs );
   });
   geometry.uvsNeedUpdate = true;
}

并给我这个结果: Textured planet

虽然到目前为止它看起来最好,但仍有接缝。那么也许这将有助于未来的人。任何想法都表示赞赏,谢谢。

0 个答案:

没有答案