書きかけ - /*
/*書きかけの謎エクスプレッション
レイヤの特定の座標位置をトレースするエクスプレッション
回転位置まで処理済み
回転の解決順序は ZYXの順のようである。 回転系の方向処理は正負の方向が逆だったようである。 とりあえず変換行列でなく回転パラメータを反転して対応中
05/08/24 kiyo
回転が逆なのは、変換行列の操作位置の間違い。 各要素ごとの積算も欲しいよ…サブルーチンかな?汎用のメソッドかな
AEの座標系はX軸で180回転した左手系…だったね、そういえば。
ひとつのレイヤの追跡が出来るようになった。 後は追跡ターゲットを複数にして、重量パラメータをのせてやればよろしいかな? 05/08/25 kiyo
思い出したように続き 複数オブジェクトの処理を配列で書く。こんなもんかな?
*/
//重心追尾エクスプレッション var TargetElements=new Array(); TargetElements=[this_comp.layer("footR")]; var TargetWeightParams=new Array(); TargetWeightParams=[10]; var ResultPoint=new Array(); ResultPoint=[0,0,0]; var TotalWeight=0; for (n=0;n<TargetElements.length;n++){ TargetObj = TargetElements[n]; //追従するオブジェクト.ここにレイヤを入れる //重量を計算トータルを加算 TargetObj.weight=TargetWeightParams[n]*TargetObj.width*TargetObj.height;//同ウェイトパラメータ TotalWeight += TargetObj.weight; //位置を初期化 pos=TargetObj.position;//位置 //回転中心からのオフセットを求める wpoffset=sub([TargetObj.width/2,TargetObj.height/2,0],TargetObj.anchor_point); x=wpoffset[0];y=wpoffset[1];z=wpoffset[2]; if(true){ x=x*TargetObj.scale[0]/100, y=y*TargetObj.scale[1]/100, z=z*TargetObj.scale[2]/100 } { rotate0=[TargetObj.rotationX,TargetObj.rotationY,TargetObj.rotationZ]; //座標原点を中心とする回転の変換行列 SX=degrees_to_radians(rotate0[0]); SY=degrees_to_radians(rotate0[1]); SZ=degrees_to_radians(rotate0[2]); //X軸回転変換行列 Tx= [ 1 ,0 ,0 , 0 ,Math.cos(SX) ,-1*Math.sin(SX) , 0 ,Math.sin(SX) ,Math.cos(SX) ].toString(); //Y軸回転変換行列 Ty= [ Math.cos(SY) ,0 ,Math.sin(SY) , 0 ,1 ,0 , -1* Math.sin(SY) ,0 ,Math.cos(SY) ].toString(); //Z軸回転変換行列 Tz= [ Math.cos(SZ) ,-1* Math.sin(SZ) ,0 , Math.sin(SZ) ,Math.cos(SZ) ,0 , 0 ,0 ,1 ].toString(); //AE互換の回転順はzyx spPos= multiMatrix(Tx,multiMatrix(Ty,multiMatrix(Tz,[x,y,z].toString()))); } if(false){ spPos=[spPos.split(",")[0]*TargetObj.scale[0]/100, spPos.split(",")[1]*TargetObj.scale[1]/100, spPos.split(",")[2]*TargetObj.scale[2]/100] } { rotate1=TargetObj.orientation; //座標原点を中心とする回転の変換行列 SX=degrees_to_radians(rotate1[0]); SY=degrees_to_radians(rotate1[1]); SZ=degrees_to_radians(rotate1[2]); //X軸回転変換行列 Tx= [ 1 ,0 ,0 , 0 ,Math.cos(SX) ,-1*Math.sin(SX) , 0 ,Math.sin(SX) ,Math.cos(SX) ].toString(); //Y軸回転変換行列 Ty= [ Math.cos(SY) ,0 ,Math.sin(SY) , 0 ,1 ,0 , -1* Math.sin(SY) ,0 ,Math.cos(SY) ].toString(); //Z軸回転変換行列 Tz= [ Math.cos(SZ) ,-1* Math.sin(SZ) ,0 , Math.sin(SZ) ,Math.cos(SZ) ,0 , 0 ,0 ,1 ].toString(); //AE互換の回転順はzyx spPos= multiMatrix(Tx,multiMatrix(Ty,multiMatrix(Tz,spPos.toString()))); } spPos=[spPos.split(",")[0],spPos.split(",")[1],spPos.split(",")[2]]; if(false){ spPos=[spPos[0]*TargetObj.scale[0]/100, spPos[1]*TargetObj.scale[1]/100, spPos[2]*TargetObj.scale[2]/100] } //spPos=div(cross(spPos,TargetObj.scale),100); TargetObj.wPoint=add(pos,spPos);//重心点プロパティを記録 //(たぶん)と思う。確認要 ResultPoint=add(ResultPoint,mul(TargetObj.wPoint,TargetObj.weight)); } div(ResultPoint,TotalWeight); // ######################## 行列計算関数群 // 行列式計算(2または3の正方行列のみ) function mDeterminant(Matrix) { if (Matrix.split(",").length!=4 && Matrix.split(",").length!=9) { return null;}//ひとまずヌル返す? if (Matrix.split(",").length==4) { //var Result [expr [lindex ${Matrix} 0] * [lindex ${Matrix} 3] - [lindex ${Matrix} 1] * [lindex ${Matrix} 2]] //2×2の正方行列式 var Result = Matrix.split(",")[0]*Matrix.split(",")[3] -Matrix.split(",")[1]*Matrix.split(",")[2]; } else { //3×3の正方行列 var Result=0; Result +=Matrix.split(",")[0]*Matrix.split(",")[4]*Matrix.split(",")[8]; Result +=Matrix.split(",")[1]*Matrix.split(",")[5]*Matrix.split(",")[6]; Result +=Matrix.split(",")[2]*Matrix.split(",")[3]*Matrix.split(",")[7]; Result -=Matrix.split(",")[0]*Matrix.split(",")[5]*Matrix.split(",")[7]; Result -=Matrix.split(",")[1]*Matrix.split(",")[3]*Matrix.split(",")[8]; Result -=Matrix.split(",")[2]*Matrix.split(",")[4]*Matrix.split(",")[6]; } return Result; } // 行列式計算終わり // 行列の積算(外積) function multiMatrix(M1,M2) { // M1 は、3×3の行列 M2は、3×? の行列でなくてはならない // それ以外の場合は、3×3 の単位行列を返す if(M1.split(",").length != 9 || M2.split(",").length % 3 !=0){ return "1,0,0,0,1,0,0,0,1"; } // 応答行列初期化 var multiprideMatrix =new Array(); // 行列の次数を設定 var D1C =3;// var D1L =3;// var D2C =Math.floor(M2.split(",").length / D1L); var D2L =D1C; for (Mi=0;Mi<D1L;Mi++){ for (Mj=0;Mj<D2C;Mj++){ var X =0; for (count=0;count<D1C;count++){ X= X+M1.split(",")[Mi * D1C +count ] * M2.split(",")[Mj % D2C +D2C * count ] ; } multiprideMatrix.push(X); } } return multiprideMatrix.toString(); } // 行列の積算終わり // 逆行列生成 //2次または3次の正方行列である必要があります。(4次と5次の拡張は必要か?) function mInverse(Matrix) { if(Matrix.split(",").length!=4 && Matrix.split(",").length!=9 && Matrix.split(",").length!=16 ){return null;} // 逆行列初期化 var InversedMatrix = new Array(); // 行列の次数を取得 var D = Math.sqrt(Matrix.split(",").length); // 余因数生成 for (j=0;j<D;j++){ for (i=0;i<D;i++){ var Cm = new Array(); for (Cj=0;Cj<D;Cj++){ for (Ci=0;Ci<D;Ci++){ if (! Cj-j){ continue } else{ if(! Ci - i ) { continue } else { Cm.push(Matrix.split(",")[Cj*D+Ci]); } } } } InversedMatrix.push(mDeterminant (Cm.toString()) * Math.pow(-1,i + j) / mDeterminant(Matrix) ) } } return transMatrix(InversedMatrix.toString()) } // 逆行列生成終わり // 行列の転置 function transMatrix(Matrix) { if(Matrix.split(",").length!=4 && Matrix.split(",").length!=9 && Matrix.split(",").length!=16 ){return null;} // 転置配列の初期化 var tranposedMatrix =new Array(); // 行列の次数を取得 var D =Math.sqrt(Matrix.split(",").length); // 転置 for(j=0;j<D;j++){ for(i=0;i<D;i++){ tranposedMatrix.push( Matrix.split(",")[i* D+j]) } } return tranposedMatrix.toString(); } // 行列の転置終わり // ########################
Powered by YukiWiki 2.1.2a / Modified by Nekomataya.