3

リビジョン48の代わりにリビジョン54を使用しているので、スクリプトで次の例外を取得します。

Uncaught TypeError: Cannot read property 'map' of undefined three.js:18155
bufferGuessUVType three.js:18155
initMeshBuffers three.js:17963
addObject three.js:21674
initWebGLObjects three.js:21608
render three.js:21145
...
THREE.JSONLoader.createModel three.js:9892
xhr.onreadystatechange

ジオメトリを。とマージしていTHREE.GeometryUtils.mergeます。その後、マージされたジオメトリを使用してメッシュを作成します。このメッシュMeshFaceMaterialでは、面のマテリアルを適用するために使用します。r54以降、これは例外になります。他の素材を使用すると動作しますが、元の面の素材は使用できません。

更新:すべての面がマテリアルを指していますgeometry.faces[i].materialIndexが、ジオメトリにはマテリアル配列が含まれていません。

更新:ジオメトリをマージしてマテリアルを保持したいだけです:)これが解決策になると思いましたmaterialIndexが、面のはマージ時に更新されません。この例を投稿して、必要なものをなんとか説明します。

mesh1 = new THREE.Mesh(new THREE.PlaneGeometry(2,2), new THREE.MeshBasicMaterial({ color: 0xFF0000}));
mesh2 = new THREE.Mesh(new THREE.PlaneGeometry(2,2), new THREE.MeshBasicMaterial({ color: 0x0000FF}));
mesh2.position.y = 3;
THREE.GeometryUtils.merge(mergedGeo, mesh1);
THREE.GeometryUtils.merge(mergedGeo, mesh2);
scene.add(new THREE.Mesh(mergedGeo, new THREE.MeshFaceMaterial([mesh1.material, mesh2.material])));

マージされた面を適切なマテリアルにリンクする独自のロジックを実装することもできますが、以前のバージョンで機能していたため、これは少しイライラします。

4

1 に答える 1

10

r52以降の移行ページで詳しく説明されているように、現在は次のようになっています。

new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materialsArray ) );

編集: マージする前に、各ジオメトリのマテリアル インデックスを設定する必要があります

THREE.GeometryUtils.setMaterialIndex( mesh1.geometry, 0 );
THREE.GeometryUtils.setMaterialIndex( mesh2.geometry, 1 );
于 2012-12-28T23:56:35.930 に答える