我试图纹理立方体球体,立方体变成具有this gnomic投影的球体,现在我试图用perlin噪声生成的单个正方形或矩形纹理来纹理化它。
接下来我尝试使用来自codepen的this uv映射代码,但是在后面留下了一个接缝。
我认为,我需要的是来自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;
}
但是给了它这个奇怪的拉伸外观
我的逻辑错了吗?有没有更容易的方法将方形或矩形纹理应用到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;
}
并给我这个结果:
虽然到目前为止它看起来最好,但仍有接缝。那么也许这将有助于未来的人。任何想法都表示赞赏,谢谢。