javascript - 使用 THREE.TextureLoader 而不是弃用的 THREE.ImageUtils.loadTexture 时出现纹理问题

标签 javascript three.js

我正在使用此函数在圆柱体上添加纹理。

function createElementMaterial() {
    THREE.ImageUtils.crossOrigin = '';
    var t = THREE.ImageUtils.loadTexture( IMG_MACHINE );
    t.wrapS = THREE.RepeatWrapping;
    t.wrapT = THREE.RepeatWrapping;
    t.offset.x = 90/(2*Math.PI);
    var m = new THREE.MeshBasicMaterial();
    m.map = t;
    return m;
}

它正在工作并添加了纹理,但在控制台中它设置了一条警告消息。

THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.

然后关注this来自 threejs.org 的文档.我把函数改成了这个。

function createElementMaterial() {
    var loader = new THREE.TextureLoader();

    // load a resource
    loader.load(
        // resource URL
        IMG_MACHINE,
        // Function when resource is loaded
        function ( texture ) {
            // do something with the texture
                texture.wrapS = THREE.RepeatWrapping;
                texture.wrapT = THREE.RepeatWrapping;
                texture.offset.x = 90/(2*Math.PI);
            var material = new THREE.MeshBasicMaterial( {
                map: texture
            } );
        },
        // Function called when download progresses
        function ( xhr ) {
            console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
        },
        // Function called when download errors
        function ( xhr ) {
            console.log( 'An error happened' );
        }
    );
}

使用此代码我无法获得纹理环绕圆柱体。这是之前和之后的图像。 TIA。 Before and After using THREE.TextureLoader()

最佳答案

你必须从你的函数中返回一个 Material 。你可以这样做:

function createElementMaterial() {

    var material = new THREE.MeshBasicMaterial(); // create a material

    var loader = new THREE.TextureLoader().load(
        // resource URL
        IMG_MACHINE,
        // Function when resource is loaded
        function ( texture ) {
            // do something with the texture
                texture.wrapS = THREE.RepeatWrapping;
                texture.wrapT = THREE.RepeatWrapping;
                texture.offset.x = 90/(2*Math.PI);
                material.map = texture; // set the material's map when when the texture is loaded
        },
        // Function called when download progresses
        function ( xhr ) {
            console.log( (xhr.loaded / xhr.total * 100) + '% loaded' );
        },
        // Function called when download errors
        function ( xhr ) {
            console.log( 'An error happened' );
        }
    );
    return material; // return the material
}

关于javascript - 使用 THREE.TextureLoader 而不是弃用的 THREE.ImageUtils.loadTexture 时出现纹理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41377034/

相关文章:

javascript - 无法重置 noUiSlider

javascript - Three.js 的 CSS3DRenderer 可以渲染网格吗?

javascript - 如何让 Three.js 全屏?

javascript - three.js - THREE.StereoEffect/webVR-样板 + THREE.Mirror

javascript - 不改变 "left"属性的可调整大小的 div

javascript - 为什么我的 JavaScript 中的 CSS 不起作用?

python - 如何立即更新 ipyvolume 形状而无需中间 View

javascript - THREE.js 正交相机缩放到鼠标点

javascript - 找不到模块 : Can't resolve 'style'

javascript - 提取div所有属性的正则表达式