克隆的模型不会加载纹理

时间:2019-03-01 15:19:06

标签: three.js

我使用ModelManager加载了很多模型,该模型跟踪相同的模型被克隆而不是多次加载。在我的应用程序中,我渲染了一个对象,然后您可以在模式之间进行切换,将所有内容从场景中删除,并将模型替换为其他模型并加载新模型。 有一种模型只是不会加载其纹理,尽管以前没有管理器就可以工作。

将其视为模式一

当我设置模式一,然后加载并渲染时,纹理显示出来,模型管理器将其存储。我可以来回更改模式及其所需的工作方式。 (我不在模式2、3上使用纹理化模型)

当我设置模式2或3,然后加载并渲染,然后切换到模式1时,该模型显示为黑色,没有纹理。 它引发了一些警告:

  

THREE.WebGLRenderer:图像不是2的幂(0x0)。调整为0x0

图片大小为512x512

  

THREE.WebGLRenderer:纹理不是2的幂。应该将Texture.wrapS和Texture.wrapT设置为THREE.ClampToEdgeWrapping。

     

纹理不是二的幂。 Texture.minFilter应该设置为THREE.NearestFilter或THREE.LinearFilter

Didnt尚未设置这些值,因为它专门针对此模型,并且以前没有它就可以工作!

  

WebGL:INVALID_VALUE:texImage2D:无画布

export class ModelManager {

static instance: ModelManager

public models: { path: string, obj: THREE.Object3D }[] = []

private loadingManager: THREE.LoadingManager
private objectLoader: THREE.ObjectLoader

private nonLoaded: boolean

public onLoad: Function

public get NonLoaded() {
    return this.nonLoaded
}

constructor() {
    if(ModelManager.instance == null)
        ModelManager.instance = this

    this.nonLoaded = true

    this.loadingManager = new THREE.LoadingManager()
    this.objectLoader = new THREE.ObjectLoader(this.loadingManager)
}


public load(path: string, onComplete: Function) {

    if(this.models.length > 1)
        this.models = Utility.removeDuplicates(this.models) // need a better approch here

    let found: boolean = false

    this.loadingManager.onLoad = ()=> {

        if(this.onLoad != null && this.nonLoaded == false){

            this.nonLoaded = true // Reset
            this.onLoad()
        }
    }

    // Check stored models 
    if(this.models.length > 0) {

        this.models.forEach(model => {

            if(model.path == path){

                found = true

                let clone = model.obj.clone()

                clone.position.set(0, 0, 0)
                clone.rotation.set(0, 0, 0)

                // console.log('Already stored!', clone)

                onComplete(clone)
            }
        })
    }

    // not found -> Load and store model
    if(!found){
        this.nonLoaded = false
        this.loadModel(path, onComplete)
    }
}


private loadModel(path: string, onLoad: Function) {

    this.objectLoader.load(path, (obj)=> {

        console.log(path, obj)

        this.models.push({
            path: path,
            obj: obj
        })


        let clone = obj.clone()

        onLoad(clone)

    }, undefined, (error)=> {
        console.error('Error',error)
    })
}

}

0 个答案:

没有答案