2016-03-11 92 views
0

我試圖用jsc3d呈現在網站上人物的化身,它還挺作品(無法弄清楚如何使它放大默認..)但無論如何,我怎麼能知道,當它共完成渲染?當共完成我想要送的base64信息發送到另一個PHP腳本生成的圖像文件作爲資料圖片使用的字符,我已經有這只是何時激活它如何判斷jsc3d何時完成渲染?

我試過的setTimeout

setTimeout(function(){ 
saveImage(); 
}, 2000); 

然而,這可能是有問題的人有不同的計算機的速度,所以它可以將圖像保存爲灰色應用紋理之前..等

我想這是對JSC3D github上,但它不工作,要麼..

viewer.onloadingcomplete = function() { 
window.open(canvas.toDataURL()); 
saveImage(); 
}; 

感謝。

+0

實際上,沒有一個「完全加載事件」,你可以結合onloadingcomplete和onresource到一個共同的回調,如果你事先知道紋理的數量。 – deblocker

回答

0

我從你的問題假設您正在使用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

相關問題