https://github.com/yamule/SCOLLAGEN
WebGL で作ったポリゴンを Collada に書き出す Javascript を書きました。
Download
元々 Java で書いていたのを Javascript に無理矢理移植したので間違いがあるかもしれません。
ごめんなさいやっぱり無理矢理移植したのでバグがありました。
(2013/Feb/02 Geometry に transform の情報が入っていないバグを修正しました。)
バグ等がありましたら twitter とかで教えて下さい。
例えばこんなこと
http://yamabukisoftworks.rash.jp/scolagen/index.html
ができます。(要 WebGL 対応ブラウザ)
GPLv3 です。
SCOLAGEN.generateFromHash というメソッドにハッシュの配列を渡して下さい。
ハッシュは
hash ={
vertex:[],//全ての点の位置を x,y,z,x,y,z,x,y... という形に展開した一次元配列
vcount:[],//いくつの点で面を作るか示す一次元配列。通常4か3
vindex:[],//面を作るのにどの点を使うか示す一次元配列
color:[]// r,g,b の形で色を示す一次元配列
}
という構成にしてください。
細かい操作はできませんが、GPL なので自由に改変してください。
あとはソースを読んで慮って下さい(ヽ´ω`)
three.js の Scene 以下にオブジェクトをぶち込んでいる場合は
function makeCollada(){
var ar = scene.__objects;
var glen = ar.length;
var geoms = new Array();
//console.log(ar.length);
for(var i = 0;i < glen;i++){
if(ar[i].geometry != null){
if(ar[i].visible == false){
continue;
}
var geo = ar[i].geometry;
//console.log(geo.vertices.length);
var varray = new Array();
var farray = new Array();
var fnumarray = new Array();
var vlen = geo.vertices.length;
var roundnum = 10000000;
for(var j = 0;j < vlen;j++){
varray.push(Math.round(geo.vertices[j].x*roundnum)/roundnum);
varray.push(Math.round(geo.vertices[j].y*roundnum)/roundnum);
varray.push(Math.round(geo.vertices[j].z*roundnum)/roundnum);
}
var flen = geo.faces.length;
for(var j = 0;j < flen;j++){
farray.push(geo.faces[j].a);
farray.push(geo.faces[j].b);
farray.push(geo.faces[j].c);
if(geo.faces[j].d == null){
fnumarray.push(3);
}else{
farray.push(geo.faces[j].d);
fnumarray.push(4);
}
}
var mtcolor = new Array(255,0,0);
if(ar[i].material != null){
if(ar[i].material.color != null){
var r = Math.min(Math.floor(ar[i].material.color.r*256),255);
var g = Math.min(Math.floor(ar[i].material.color.g*256),255);
var b = Math.min(Math.floor(ar[i].material.color.b*256),255);
mtcolor[0] = r;
mtcolor[1] = g;
mtcolor[2] = b;
}
}
var ha ={
vertex:varray,
vindex:farray,
vcount:fnumarray,
color:mtcolor
};
geoms.push(ha);
}
}
var dlc = document.getElementById("dldiv");
if(dlc.childNodes.length > 0){
dlc.removeChild(dlc.childNodes[0]);
}
dlc.appendChild(makeDLLink(SCOLAGEN.generateFromHash(geoms)));
};
function makeDLLink(dat) {
var c = (window.URL || window.webkitURL).createObjectURL(new Blob([dat]))
var ret = document.createElement("a");
ret.setAttribute("href", c);
ret.innerHTML = "Download";
return ret;
};
こんな感じで id="dldiv" とした要素の子に Collada ファイルのダウンロードリンクができると思います。
まあ three.js には Blender で読み込めるようにする機能があるので必要ないっちゃ必要ありません。。。