我正在建造第一人称迷宫 - 迷宫中的每个墙都是THREE.PlaneGeometry
。据我了解,将这些墙全部合并为单个对象是更好的做法。我创建了一个类“墙”,每次添加一个新的“墙”时都会这样做:
this.geometry.merge(wall.mesh.geometry, wall.mesh.matrix);
在添加所有墙壁后,我创建了一个材质+应用纹理:
this.material = new THREE.MeshBasicMaterial( {
map: this.texture,
side: THREE.DoubleSide
} );
this.mesh = new THREE.Mesh( this.geometry, this.material );
我遇到的问题是墙壁的宽度并不完全相同,因此纹理映射在合并的地理位置上变得非常时髦(Image Here)。每个平面接收整个纹理并将其拉伸到其尺寸。请记住,所有的墙壁都需要相同的纹理,在墙壁周围“包裹”纹理的最佳方法是什么?或者我应该首先以不同的方式构建我的墙?
我还给了Three.MultiMaterial(materials)
和THREE.MeshFaceMaterial(materials)
一个go(给每一面墙提供了一种独特的材料),但这些都严重影响了性能。
提前致谢,
快乐的日子,
Ĵ
屏幕截图:Maze Image
答案 0 :(得分:0)
在每个墙的地理位置的每个faceVertexUV上运行一个循环。将每个UV.x乘以墙的宽度(消除拉伸/收缩)。在墙的UV.x上添加一个偏移量,该偏移量对应于到目前为止的墙宽度的总和:
var len = wall.geometry.faceVertexUvs[0].length;
for (var i = 0; i < len; i++){
for (var j = 0; j < 3; j++){
wall.geometry.faceVertexUvs[0][i][j].x *= wall.w;
wall.geometry.faceVertexUvs[0][i][j].x += this.w;
}
}
this.w += wall.w;