1

私の目標は、単一のテクスチャを持つ立方体/ボックスを作成することですが、側面ごとに異なる繰り返し値を作成することです。作業コードは以下のとおりです。

var cubeMaker = function(w,h,d, tName)
{
    var g = new THREE.CubeGeometry( 50*w, 50*h, 50*d );

    var tx = THREE.ImageUtils.loadTexture( tName );
    var ty = THREE.ImageUtils.loadTexture( tName );
    var tz = THREE.ImageUtils.loadTexture( tName );

    tx.wrapS = tx.wrapT = THREE.RepeatWrapping;
    ty.wrapS = ty.wrapT = THREE.RepeatWrapping;
    tz.wrapS = tz.wrapT = THREE.RepeatWrapping;

    tx.repeat.set(d,h);
    ty.repeat.set(w,d);
    tz.repeat.set(w,h);

    var mx = new THREE.MeshBasicMaterial( {map: tx} );
    var my = new THREE.MeshBasicMaterial( {map: ty} );
    var mz = new THREE.MeshBasicMaterial( {map: tz} );

    var mArray = [mx,mx,my,my,mz,mz];
    var m6 = new THREE.MeshFaceMaterial( mArray );

    var cube = new THREE.Mesh(g, m6);
    return cube;
}

ただ、テクスチャを3回ロードするのはもったいない気がします。前に、次のように、(ファイル名を表す文字列の代わりに) テクスチャを引数として関数に渡そうとしました。

var cubeMaker = function(w,h,d, texture)
{
    ...
    var tx = texture.clone();
    var ty = texture.clone();
    var tz = texture.clone();
    ...

しかし、その後、テクスチャはシーンに表示されず、代わりに黒一色の画像のみが表示されました。私の推測では、clone メソッドが呼び出される前にテクスチャ イメージの読み込みが完了しておらず、代わりに何らかの null 値がコピーされた可能性があります。クローン機能が意図したとおりに機能するように、onLoad メソッドを使用して十分な時間待機する方法はありますか?

注: Can't clone() Textureの提案を試しましたが、問題は解決しません。

ご協力ありがとうございます。

4

2 に答える 2

0

関数の外でテクスチャを作成し、このテクスチャを関数内で使用して、各側の特別な変数に割り当ててみませんか? そうすれば、一度だけロードすることが確実になります。

于 2013-08-13T22:20:39.110 に答える