0

私は一人称迷路を構築しています - 迷路の各壁は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)試しました (各壁に独自のマテリアルを適用します) が、どちらもパフォーマンスを大幅に低下させます。

前もって感謝します、

幸せな日々、

J

スクリーンショット:迷路の画像

4

1 に答える 1

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;
于 2016-05-25T12:08:50.913 に答える