我從你的問題假設您正在使用OBJ文件格式,所以我會告訴你如何創建一個回調,以便在MTL文件中的所有紋理加載,並應用於網格:
更改jsc3d.js如下(原代碼的某些部分已經跳過了簡潔):
1)添加新的回調在viewer.loadScene功能,直下loader.onresource
JSC3D.Viewer.prototype.loadScene = function() {
[...]
loader.onresourcecomplete = function() {
if(self.onscenecomplete && (typeof self.onscenecomplete) == 'function')
self.onscenecomplete();
};
[...]
};
然後,你需要跟蹤的紋理請求,並降低儘快將每一個紋理已經被下載的總數和應用於網格:在您的主JS
JSC3D.ObjLoader = function(onload, onerror, onprogress, onresource) {
[...]
this.resourceRequestCount = 0;
};
JSC3D.ObjLoader.prototype.loadMtlFile = function(scene, urlPath, fileName) {
[...]
for(var textureFileName in textures)
self.resourceRequestCount++;
[...]
};
JSC3D.ObjLoader.prototype.setupTexture = function(meshList, textureUrlName) {
var self = this;
var texture = new JSC3D.Texture;
texture.onready = function() {
for(var i=0; i<meshList.length; i++)
meshList[i].setTexture(this);
if(self.onresource)
self.onresource(this);
if(--self.resourceRequestCount == 0)
self.onresourcecomplete();
};
texture.createFromUrl(textureUrlName);
};
在viewer.onscenecomplete事件文件,你可以打電話viewer.update()
並保存您的位圖,當你在onloading完全一樣,但是當OBJ和MTL文件已經被下載了,還沒有紋理,如果有的話引發該事件。
請注意,你需要另外也實現一些其他小的變化,比如重置resourceRequestCount當請求已經中止,和其他一些簡單的清理。
這裏有一個更詳細的更新日誌:jsc3d.v2 on GitHub
實際上,沒有一個「完全加載事件」,你可以結合onloadingcomplete和onresource到一個共同的回調,如果你事先知道紋理的數量。 – deblocker