1

各メッシュには 1 つのテクスチャがあるため、異なるジオメトリを持つ複数のメッシュを作成するループがあります。

var geoCube = new THREE.CubeGeometry(voxelSize, voxelSize, voxelSize);
var geometry = new THREE.Geometry();

for( var i = 0; i < voxels.length; i++ ){
  var voxel = voxels[i];
  var object;
  color = voxel.color; 
  texture = almacen.textPlaneTexture(voxel.texto,color,voxelSize); 
  //Return the texture with a color and a text for each face of the geometry
  material = new THREE.MeshBasicMaterial({ map: texture });                       
  object = new THREE.Mesh(geoCube, material);

  THREE.GeometryUtils.merge( geometry, object );
}

//Add geometry merged at scene
mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() );
mesh.geometry.computeFaceNormals();
mesh.geometry.computeVertexNormals();
mesh.geometry.computeTangents();

scene.add( mesh );

しかし今、私はjavascriptコードThree.jsにこのエラーがあります

キャッチされていない TypeError: 未定義のプロパティ 'マップ' を読み取ることができません

関数内:

function bufferGuessUVType ( material ) {
}

アップデート:

最後に、マージされたソリューションを削除し、すべてのボクセルに一意のジオメトリを使用できるようにしました。マージメッシュを使用すると、アプリのパフォーマンスが向上すると思いますが。

4

2 に答える 2

2

r53+ の場合、コードは次のようになります。

var geoCube = new THREE.CubeGeometry(voxelSize, voxelSize, voxelSize);
var geometry = new THREE.Geometry();
var materials = [];

for( var i = 0; i < voxels.length; i++ ){

  for ( var j = 0; j < geoCube.faces.length; j ++ ) {
    geoCube.faces[ j ].materialIndex = i;
  }

  var object = new THREE.Mesh( geoCube );
  // here I assume you'll me positioning the object.
  THREE.GeometryUtils.merge( geometry, object );

  var voxel = voxels[i];
  var texture = almacen.textPlaneTexture(voxel.texto,voxel.color,voxelSize);
  materials.push( new THREE.MeshBasicMaterial( { map: texture } ) );

}

// Add geometry to scene

var mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( materials ) );
mesh.geometry.computeFaceNormals();
mesh.geometry.computeVertexNormals();

scene.add( mesh );
于 2012-12-17T12:10:31.467 に答える
0

一部のメソッドは、マテリアル配列がメッシュ フェース マテリアルにあることを想定しています。例えば:

function getBufferMaterial( object, geometryGroup ) {

    return object.material instanceof THREE.MeshFaceMaterial
        ? object.material.materials[ geometryGroup.materialIndex ]
        : object.material;

};

これは、ジオメトリとメッシュ フェース マテリアルの両方でマテリアル配列を参照することで処理できます。したがって、メッシュが作成される行は次のようになります。

mesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial(geometry.materials) );

ボクセルを処理するループでは、次のようになります。

geometry.materials.push( new THREE.MeshBasicMaterial({ map: texture }));

ジオメトリの各面にも materialIndex を割り当てる必要があります。そうしないと、エラーが発生します。各ボクセルの面数がわかっている場合は、geometry.faces[] をループして materialIndex を割り当てるのが良い方法です。

于 2012-12-17T06:05:55.653 に答える