如何使用Threejs(r65)的纹理图集?

时间:2014-01-26 09:58:34

标签: javascript three.js

自新的threejs版本(r65)发布以来,uvOffset和uvScale被移动到texture.offset和texture.repeate。

不幸的是,texture.offset对我来说并不适用于我想要完成的任务。我想在场景中显示多个使用相同纹理的精灵。纹理是具有不同瓷砖的纹理图集。如果我更改了texture.offset,则会更改场景中所有精灵的纹理。有没有解决方案只为每个精灵单独更改偏移量?

我认为uvOffset做得很好,我不明白为什么会被移动。

以下是一些代码,可以看到我要做的事情:

var gui_texture = THREE.ImageUtils.loadTexture('images/button.png');

var btn_material1 = new THREE.SpriteMaterial( { map:gui_texture } );
btn_material1.map.offset.set(0.5,0);
var button = new THREE.Sprite(btn_material1);
button1.position.set(-screen_half_x+50, screen_half_y-25, 1);
button1.scale.set(100, 50, 1);
gui_node.add(button1);

var btn_material2 = new THREE.SpriteMaterial( { map:gui_texture } );
btn_material2.map.offset.set(-0.5,0);
var button2 = new THREE.Sprite(btn_material2);
button2.position.set(-screen_half_x+50, screen_half_y-150, 1);
button2.scale.set(100, 50, 1.0);
gui_node.add(button2);

此致

马库斯

1 个答案:

答案 0 :(得分:1)

我意识到这不是最漂亮的......但试试这个:

var texture1 = new THREE.Texture();
texture1.offset.set( 0.5, 0 );

var texture2 = new THREE.Texture();
texture2.offset.set( - 0.5, 0 );

var loader = new THREE.ImageLoader();
loader.load( 'images/button.png', function ( image ) {

    texture1.image = image;
    texture1.needsUpdate = true;

    texture2.image = image;
    texture2.needsUpdate = true;

} );

var button1 = new THREE.Sprite( new THREE.SpriteMaterial( { map:texture1 } ) );
button1.position.set( - screen_half_x + 50, screen_half_y - 25, 1 );
button1.scale.set( 100, 50, 1 );
gui_node.add( button1 );

var button2 = new THREE.Sprite( new THREE.SpriteMaterial( { map:texture2 } ) );
button2.position.set( - screen_half_x + 50, screen_half_y - 150, 1 );
button2.scale.set( 100, 50, 1.0 );
gui_node.add( button2 );