three.js を使用して、フリップ キューブ (別名マジック キューブ。このページのビデオなどを参照)を表示する Web ページに取り組んでいます。
フリップ キューブでは、通常、キューブの複数の部分にまたがる画像があります。たとえば、上に示したボートの画像は、4 つの立方体の面全体に広がっています。three.js の用語では、マテリアル テクスチャに同じ画像を使用する必要がある複数のメッシュがありますが、それぞれのオフセットは異なります。
私が理解している限りでは、three.js では、オフセットはテクスチャのプロパティであり、マテリアルやメッシュのプロパティではありません。したがって、1 つのテクスチャを 2 つの異なる場所で異なるオフセットで使用することはできないようです。
つまり、ボートの画像の異なる部分を 4 つの異なる面に表示するには、4 つの個別のテクスチャを作成する必要があるということでしょうか。つまり、ボートの画像をメモリに 4 回読み込む必要があるということですか? そうではないことを願っています。
関連するコードは次のとおりです。
// create an array with the textures
var textureArray = [];
var texNames = ['boat', 'camels', 'elephants', 'hippo',
'natpark', 'ostrich', 'coatofarms-w', 'kenyamap-w', 'nairobi-w'];
texNames.map(function(texName) {
textureArray.push(THREE.ImageUtils.loadTexture(
'images/256/' + texName + '.jpg' ));
});
// Create a material for each texture.
for (var x=0; x <= 1; x++) {
for (var y=0; y <= 1; y++) {
for (var z=0; z <= 1; z++) {
var materialArray = [];
textureArray.map(function(tex) {
// Learned: cannot set this offset for one material,
// without it affecting all materials that use this texture.
tex.offset.x = x * 0.2;
tex.offset.y = y * 0.2;
materialArray.push(new THREE.MeshBasicMaterial( { map: tex }));
});
var cubeMaterial = new THREE.MeshFaceMaterial(materialArray.slice(0, 6));
var cube = new THREE.Mesh( cubeGeom, cubeMaterial );
cube.position.set(x * 50 - 25, y * 50 - 25, z * 50 - 25);
scene.add(cube);
}
}
}
http://www.huttar.net/lars-kathy/tmp/flipcube.htmlでそれを見ると、すべてのテクスチャ イメージが各キューブレット面で同じ量だけオフセットされて表示されていることがわかります。異なるキューブレットで異なるオフセットに設定されています。これは、同じテクスチャを異なるオフセットで異なる用途に使用できないことを確認しているようです。
同じ画像を複数のテクスチャに何度もロードする必要がないように、異なるオフセットで同じテクスチャを使用するように異なるメッシュを取得するにはどうすればよいですか?