そういうわけで、unitQuaternionを設定していないでpositionだけを設定したczmlファイルからorientation{epoch:,unitWQuatenion:}を自動的に設定するスクリプトを作成してみた。
まだ、プログラムとしては不完全で、1個のモデルにしか対応していないのだが、まあそこは拡張できるだろう・・ということで参考に利用していただければいいなあと思う訳である。
4行目あたりの./air.czmlがオリジナルのczmlでこれを
node ff.fs >air2.czml
とかすれば無事unitQuaternionを追加したczmlができあがるというものである。
まあ、オリジナルのpositionはcartographicDegreesで書いてあることが前提
であったり、epochタイプで指定してあるのが前提であるとかいろんな限定があるのだが、あくまで参考である。よろしく
そうか、ソースにあるように、../../Source/Cesium.jsで動くので動かす場所によってここを操作しないといけないということなので、そこもよしなに
ff,js
r=require('requirejs');
var C=r('../../Source/Cesium.js');
fs = require('fs');
fs.readFile('./air.czml', 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
cz=JSON.parse(data);
pg=cz[1].position.cartographicDegrees;
//console.log(pg);
var po=new C.SampledPositionProperty();
var t0=C.JulianDate.fromIso8601(cz[1].position.epoch);
var t1=t0;
len=pg.length/4;
for (var i=0;i<len;i++){
p1=C.Cartesian3.fromDegrees(pg[i*4+1],pg[i*4+2],pg[i*4+3]);
t1=C.JulianDate.addSeconds(t0,pg[i*4],new C.JulianDate());
po.addSample(t1,p1);
}
var ori=new C.VelocityOrientationProperty(po);
xx=[]
q1=new C.Quaternion();
for (var i=0;i<len;i++){
t1=C.JulianDate.addSeconds(t0,pg[i*4],new C.JulianDate());
ori.getValue(t1,q1);
xx[i*5]=pg[i*4];
xx[i*5+1]=q1.x;
xx[i*5+2]=q1.y;
xx[i*5+3]=q1.z;
xx[i*5+4]=q1.w;
}
cz[1].orientation={epoch:cz[1].position.epoch,unitQuaternion:xx};
console.log(JSON.stringify(cz,null,'\t'));
});