我使用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)
})
}
}