Threejs TextureLoader CubeGeometry

时间:2015-10-29 07:38:53

标签: javascript three.js

我正在学习threejs,我希望我的立方体每侧有6种不同的纹理。我确实使用loadTexture

var material3 = new THREE.MeshPhongMaterial( {map: THREE.ImageUtils.loadTexture('textures/ps.png')} );

我确实在数组中保存了6个这样的材料然后使用THREE.MeshFaceMaterial。但是THREE.ImageUtils.loadTexture存在问题,因为它已被弃用,我应该使用THREE.TextureLoader,我不知道如何以这种方式加载6个纹理。

这就是我所拥有的:

function texture()
{
    var loader = new THREE.TextureLoader();
    loader.load( 'textures/ps.png', function ( texture )
    {
        var geometry = new THREE.CubeGeometry( 10, 10, 10 );

        var material = new THREE.MeshBasicMaterial( { map: texture, overdraw: 0.5 } );
        mesh = new THREE.Mesh( geometry, material );
        mesh.position.z = -50;

        scene.add( mesh );
    } );
}

2 个答案:

答案 0 :(得分:3)

我认为这与您正在寻找的内容非常接近:

function MultiLoader(TexturesToLoad, LastCall, ReturnObjects) {
        if (TexturesToLoad.length == 0) return;
        if (!ReturnObjects) ReturnObjects = [];
        var loader = new THREE.TextureLoader()
        //Pop off the latest in the , 
        //you could use shift instead if you want to read the array from 
        var texture = TexturesToLoad.shift()

        loader.load(texture,

        function (texture) {
            ReturnObjects.push(texture);
            if (TexturesToLoad.length > 0) {
                MultiLoader(TexturesToLoad, LastCall, ReturnObjects)
            } else {

                LastCall(ReturnObjects)
            }

        },
        LoadProgress,
        LoadError);
    }

    function LoadProgress(xhr) {
        console.log(('Lodaing  ' + xhr.loaded / xhr.total * 100) + '% loaded ');
    }

    function LoadError(xhr) {
        console.log('An error happened  ');
    }

用这个

来称呼它
var TexturesToLoad = []
TexturesToLoad.push("../surfacemap.jpg")
TexturesToLoad.push("../normalmap.jpg");
TexturesToLoad.push("../spekularmap.jpg");
    var ReturnedMaterials=[];
    var ReturnMaterials=[];



    var LastCall=function(ReturnedMaterials)
    {
            var surfaceMap =  ReturnedMaterials[0];        
            var normalMap =   ReturnedMaterials[1];                    
            var specularMap = ReturnedMaterials[2];         

            var decalMaterial = new THREE.MeshPhongMaterial( 
            {           
                map: surfaceMap,
                normalMap: normalMap,
                normalScale: new THREE.Vector2( 1, 1 ),
                specularMap: specularMap,
                transparent:false,  
                wireframe: false 
            } );

        var globeGeometry = new THREE.SphereGeometry(100.0, SPHERE_SIDES, SPHERE_SIDES);            
        mesh = new THREE.Mesh( globeGeometry, decalMaterial ); 
        mesh.rotation.x=Math.PI/2;


    };

    MultiLoader(TexturesToLoad,LastCall,ReturnMaterials)

说明: 新的THREE.TextureLoader使用回调函数。这可以确保在您需要添加时正确加载您正在使用的资源。 但是,如果你想使用大量材料,回调很困难。 MultiLoader上方允许您以递归方式调用,然后回调您想要使用所有材料的函数。材料被收集到一个数组中(ReturnObjects)。

答案 1 :(得分:1)

有很多方法可以实现它。我会告诉你2;

1) 使用自己的顶点和面

制作对象(立方体)
.vertices.push( new THREE.Vector3( x, y, z ) );
.faces.push( new THREE.Face3( x, y, z ) );

I've prepared an example in jsfiddle

2) 使用UV贴图。首先,您需要在Blender等3D软件中使用UV贴图准备对象,并将其导出为JSON文件。

I've also prepared an example in jsfiddle

If you are not familiar with UV map or Blender, check toturials