編集(管理者用) | 編集 | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴
== o ==
ねこまたや web出張所
INDEX

トップページ
お知らせ
twitter
お道具箱
技術資料と雑談
ライブラリ
雑貨や(ダウンロード)
最近の更新
ねこまたやについて

twitter

ねこまたやのついった

企画モノ

psAxe情報ページ
自主制作アニメ
ぽこあぽこ られんたんど


あやかしあやし
エフェクトネタ帳



りまぴん
AE エクスプレッション
レンダー乙女とか
簡易版XPSリンカ
おまけギャラリ

BBS

ねこまたやBBS
開発室BBS

Language



開発室みたいなものでしたが
spamアクセスがはげしいのでページは凍結中です。
書き換えは管理人のみが可能です。
Nekomataya/2024

書きかけ - /*


 /*
書きかけの謎エクスプレッション

レイヤの特定の座標位置をトレースするエクスプレッション

回転位置まで処理済み

回転の解決順序は 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();
}
//  行列の転置終わり
// ########################