トップ | puarts.com
メモ  |  制作記  |  開発記  |  日常の記録  |  デジタルコンテンツ制作  |  ファイアーエムブレム  |  ゲーム  |  C/C++  |  C#  |  PC/ソフトウェア  |  Web 開発  |  スクリプト言語  |  その他プログラミング  |  
「Expression」に関連する記事一覧

0  

After Effects エクスプレッションの「スライダ」→「スライダー」にはまる

今更という感じもありますが、古い After Effects のプロジェクトを After Effects CC 2015 で開いたら、スライダー制御エフェクトの名前が「スライダ」から「スライダー」に変更されたことにより、軒並みエクスプレッションがエラーになり、うぅっ..となりました。手動置換つらすぎ。

本来はプロジェクト読み込んだ時に互換性が失われるものについては自動更新されてほしいですが、Adobe のローカライズしている人は気づかなかったのかな..

今後はさぼらずに下記ページに記載のような書き方をしておくようにします。

http://www.da-tools.com/AE/exp/jisen/matchName.html

こちらのページだとエフェクト名を変更すれば、下記のように書けると書いてありますが、


effect("WiggleStrength")

After Effects CS2 だとエラーになりました。


effect("WiggleStrength")(1)

こちらのように書くことはできたので、古いバージョンのプロジェクトではこのような書き方にしておこうと思います。

Maya Expression で Aim Constraint をするメモ

2015/07/11

Maya の Expression で Aim Constraint をするメモ。

obj が回転対象、targetが目標物。


float $axis_x = 0.0;
float $axis_y = 1.0;
float $axis_z = 0.0;
float $dx = target.translateX - obj.translateX;
float $dy = target.translateY - obj.translateY;
float $dz = target.translateZ - obj.translateZ;
float $angles[] = `angleBetween -euler -v1 $axis_x $axis_y $axis_z -v2 $dx $dy $dz`;
obj.rotateX = $angles[0];
obj.rotateY = $angles[1];
obj.rotateZ = $angles[2];

AE 三角関数で擬似的にバウンドモーションを作るエクスプレッション

2011/06/06
(2018/11/05 更新)

三角関数から擬似的なバウンドモーションを作るAfter Effectsの簡易エクスプレッションを作りましたので載せておきます。

下のようなロゴアニメーションを作るときなどに応用できます。

ロゴアニメーションの画像

以下がソースコードです。バウンドをつけたいレイヤーのpositionにコピペしてエクスプレッション内のパラメータ(r, offset, sh)を調整して使って下さい。


var r=1.7; // バウンドするときの抵抗力の強さ
var offset=120; // 接地点
var sh=200; // 全体の高さのスケール

var y=-Math.abs(Math.cos(2*Math.PI*time))
      *sh*Math.exp(-time*r)+offset;
[position[0], y];

Maya expression内でMELを使うときの注意

2010/08/21

Mayaではexpression内でMEL文を利用することは奨励されていませんが、使うことは可能です。
少し複雑なモーション(特にパーティクルモーションの制御)をexpressionで作ろうとすれば、expression内でMELを使わないと結構厳しいです。

以下に私が思うexpression内でMELを使うときの注意や覚えておくべきことを記します。

1. 名前の変更はMELで書いた部分には反映されないため、MELを使う場合は名前の変更はできない。

2. expressionが評価されるタイミングはフレームが変わったときと、入力コネクションに変化があったとき。

3. MELでアトリビュートをセットしたとき、そのアトリビュートにexpression内で何か値を代入していると、代入された値が優先され正常に動作しないことがあるため、同アトリビュートに対してMELと式での代入の混在は避けるべき。
例えば、以下のようなexpressionを記述するのは危険。


particleShape1.radiusPP = 0;

particle -e -at radiusPP -id 0 -fv 2.0 particleShape1;
 

4. expressionは生成された順番に評価されるため、expression同士が干渉している場合は注意。コネクションが繋がっていれば後のexpressionで変化があれば前のexpressionにも反映されるが、MELを使っている場合は反映されないため、expressionの生成順序で結果が異なる。

5. expressionにコネクションが作られたPP(Per Particle)アトリビュートは配列の0番目からパーティクル数番目まで順番に評価される。MELではparticleコマンドやgetParticleAttrコマンドなどで配列の好きな要素に自由にアクセスできるため、MELを混在する場合、評価される順番を考慮する必要がある。

6. expression内でMELを使って生成した新しいexpressionは次のフレームから評価される。



他にも留意すべき点はあるかもしれませんが、私が思いつくのはこのくらいです。

しかし、あまり複雑であれば、expressionノードに頼らず、APIで作る方がよっぽど賢いと思います。

私は何百個のexpressionでモーションを制御しようとしたことがありますが、シーンを保存するとexpressionの中身が書き代えられてしまうというMayaのバグに対策を立てることができずに、結局APIでカスタムノードを作り、expressionの中身の式をそっくりそのままカスタムノード内で計算させ対応しました。

実際、expressionで制御するのとカスタムノードで制御するとでは処理速度もかなり違いますし、うまく作ればバグも出ないので、ある程度複雑になったらAPIで作る方がコストはかからなくて済むので良いと思います。

MEL expressionを生成するMEL文の自動生成

2009/02/07
仕事をしていると、MELで自動的にエクスプレッションが組まれるようなツールを作ることが頻繁にあります。

ただ、エクスプレッションが自動に組まれるようなMELを書くのは結構面倒臭い作業なんですよね。

例えば

pCube1.rx=time;
pCube1.ry=time * 0.5;
pCube1.rz=time * 2;

というエクスプレッションを生成するMELは次のようになります。

string $exp = "pCube1.rx=time;\npCube1.ry=time * 0.5;\npCube1.rz=time * 2;";
expression -s $exp;

これは短い文なのでまだ楽ですが、長くなってくるとどこがどうなってるのかわからなくなってきて混乱してしまいます。
さらに、あとで修正するときはもっと大変ですね。どこがどこだか探すだけで一苦労。


そういうわけで、自動的にエクスプレッションが生成できるMELを生成するスクリプトを書きました。

使用方法
1.
エクスプレッションのソースを書いたファイルをテキストファイルでいいのでどこかに保存します。

pCube1.rx=time;
pCube1.ry=time * 0.5;
pCube1.rz=time * 2;

といったような内容でテキストを保存します。

2.
INPUT=先ほど保存したファイルのパス
OUTPUT=生成されたMEL文を保存しておくファイルパス
とすると
コマンドラインに

makeExpGen(INPUT, OUTPUT);

と入力して実行します。

例えば

makeExpGen("C:/exp.txt", "C:/generated.txt");

というような感じです。

3.
 保存されたファイルに完成した文が書き込まれているので、それをコピーしてプロシージャの作成などに利用します。
2の例ではC:/にgenerated.txtというファイルが生成されています。



エクスプレッション中のdestinationの名前を変更できるようにしたりはしていないです。
これから、もう少し機能を拡張させようと思います。



以下がソースコードです。

global proc makeExpGen(string $srcFile,string $destFile){
 int $srcId = fopen($srcFile,"r");
 int $destId = fopen($destFile,"w");
 fprint($destId,"$expName = \"expression\";\nstring $exp=\"");
 string $nextLine = `fgetline $srcId`;
 $nextLine = `substitute "\n" $nextLine " "`;
 string $exp = $nextLine;
 while ( size( $nextLine ) > 0 ) {
  print ( $nextLine );
  $nextLine = `fgetline $srcId`;
  $nextLine = `substitute "\n" $nextLine " "`;
  $nextLine = substituteAllString($nextLine, "\"", "\\\"");
  $exp += "\\n"+$nextLine;
 }
 fprint($destId,($exp +"\";\nexpression -s $exp -n $expName;"));
 fclose($srcId);
 fclose($destId);
}
0  

にほんブログ村 ゲームブログ ファイアーエムブレムへ にほんブログ村 デザインブログ コンピュータグラフィックスへ

0.0251 sec

Copyright(C)2006-2018 wsp All Rights Reserved