サンプルコード

エクスプレッション、オートメーションのサンプルコードを投稿するページです。

投稿者の方へ
投稿時は、下記の書式に従って記述して下さい。

#code(言語名){{

//ここにコードを記述

}}
言語名に関しては、オートメーション、エクスプレッションはcsharp、プロパティスクリプトはpropertyscriptとしてください。

また、長いコードは

#code(言語名, コード)

の様に言語名の後に適当な名前を指定するとコードを折りたたむことが出来ます。

※投稿時にはコード種別(オートメーションなのかエクスプレッションなのか、プロパティスクリプトなのか)を明示するようにして下さい。
※オートメーションの場合は「保存」でテキスト形式で保存し、そのテキストファイルの内容をそのまま貼り付けて下さい。
※エクスプレッションの場合は「エクスプレッションの保存」でテキスト形式で保存し、そのテキストファイルの内容をそのまま貼り付けて下さい。

投稿されたコードを使用しようと考えている方へ
エクスプレッション、オートメーションは、ある程度NiVEの操作に慣れている方用の機能です。
これらの使用方法については、付属の「エクスプレッション・オートメーションについて.pdf」をご覧下さい。

※オートメーションの場合は、コードをメモ帳にコピーして、文字コードを「UTF-8」にして保存し、
  オートメーションの「読み込み」からそのテキストファイルを開き、実行します。
※エクスプレッションの場合は、コードをメモ帳にコピーして、文字コードを「UTF-8」にして保存し、
  「エクスプレッションの読み込み」からそのテキストファイルを開き、実行します。

また、質問に関しては、言語に関する質問や、コードの書き方等、投稿されたコードに関係ない質問はご遠慮下さい。


(画像の文字列を入力して下さい)

円エフェクトの半径と不透明度をランダムに

(2011-03-12 (土) 16:04:56)

ディスプレイスメントマップを使って波紋を作っているんですが、マップで波紋のように変形させるため円エフェクトを使っています。
半径を0から300、それに合わせて不透明度を100から0を2秒で行うようにに設定しています。
それを何個か並べているのですが動きがみな同じなため、機械的な波紋に見えてしまいます。エクスプレッションで半径と不透明度をランダムに設定することはできないのでしょうか?

プロジェクトファイルを上げました。
http://u9.getuploader.com/nicoAE/download/522/%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%AD%89.zip
よろしくお願いします。


(画像の文字列を入力して下さい)

プロパティスクリプト投稿テスト

うp主? (2011-02-21 (月) 18:40:24)

プロパティスクリプトのサンプルのテスト。
開始や終了を1フレームごとに1文字分変化させるのに便利な感じのスクリプト。

Everything is expanded.Everything is shortened.
  1
 
return 100.0 / strLen(replace(getProperty("ソーステキスト"), "\r\n", "")) * timeToFrames(time);



(画像の文字列を入力して下さい)

レンダラの選択サンプル

うp主? (2011-02-09 (水) 14:36:03)

オートメーションでのレンダラの選択について質問があったので、適当ですがやってみました。

+  rendererselectsample



(画像の文字列を入力して下さい)

投稿方法について

金の髭? (2010-12-26 (日) 21:05:58)

Wikiそのものの質問になってしまって恐縮なのですが・・・。
 質問1.試しに以下の例のように記述して投稿してみたところ、他の記事も含めて全体が折りたたまれてしまいました。
      投稿時はcode(csharp)だけで投稿し、regionは投稿後ページ編集で付け足す必要があるのでしょうか?
      (下の例では行頭の#は省略しています)
 質問2.regionが使われるたびに、その後の記事のインデントがずれていっているようですがこれは仕様になりますでしょうか。

↓投稿例

region(←コードはこちら)

code(csharp){{

int a=0;

}}

endregion

  • 確認しました。どうやら、#endregionの後に~が入ることによって、影響範囲がおかしくなってしまうようです。また、インデントについては#regionの次の行に~を入れると解消されるようです。いずれも修正できる場合は修正しておきます。 -- うp主? 2010-12-29 (水) 19:15:22
  • と思ったら、どうやら~を挟んでもインデントは解除されないようです orz &nop(#region)自体が結構裏技的なことをやっているそうなので、この問題の解決は難しいかもしれません。 -- うp主? 2010-12-29 (水) 20:12:07
  • codeプラグインの方に手を加えてregionプラグインを使用せずに折りたためるようにしてみました。これで多分インデントの問題も解決できるかと思うので、そちらを試してみてください。 -- うp主? 2010-12-30 (木) 01:12:24
  • 上の例でうまくいくことを確認しました。対応ありがとうございます。色々すみません。 -- 金の髭? 2010-12-31 (金) 23:36:29

(画像の文字列を入力して下さい)

ウィグル適用ウインドウ

うp主? (2010-12-12 (日) 13:17:57)

指定したプロパティにウィグルを適用し、キーフレームを設定します。

使い方:
各コンボボックスから適用したいものを選択します。
間隔、複雑度、強さ、開始時間、終了時間を入力し、適用を押します。

パラメータの説明:
対象  : プロパティを所持するエフェクト、またはレイヤープロパティを指定します
次元  : 値を適用する次元(軸)を選択します。
間隔  : 1秒間にキーフレームをいくつ置くかを設定します。
複雑度 : 振動の激しさを設定します。
強さ  : 値の変化の度合いを設定します。
開始時間: キーフレームの設置を開始する時間をレイヤーのローカル時間で設定します。
終了時間: キーフレームの設置を終了する時間をレイヤーのローカル時間で設定します。
適用  : 設定を元にキーフレームを設定します。
閉じる : ウインドウを閉じます。
コンポジション更新: コンポジションの情報を更新します。
これ以外のコンボボックス: 見たままなので略。

以下コード。長め注意

+  コード


  • effectPaddingの宣言行がコロンで終わっていたので勝手ながらセミコロンに修正しました。また、どうもコード表示で不等号の扱いにクセがあるようで、Dictionary型のpropertyDataなどの宣言や初期化が死んでます。不等号のあとに半角スペースを入れるようにすれば問題ないようですが、他にも何かあるようで、ブラウザからそのままメモ帳にコピペしても動作せず、編集画面を開いてコピーしないと動かないようです。if文とかでも不等号のあとにスペースをあけずに変数を書いてしまうとおかしくなってしまうようです。 -- 金の髭? 2010-12-13 (月) 07:04:05
  • 報告&修正ありがとうございます。codeプラグインの方を修正して不等号を<などの特殊文字で置き換えるようにしてみました。コードをテキストに保存して読み込んでも動かない件についてですが、テキストファイルからのオートメーションの読み込みがUTF-8のみに対応しているため、それ以外の文字コードで書かれたものが文字化けしているためではないかと思われます。 -- うp主? 2010-12-13 (月) 08:42:30
  • 対応ありがとうございます。ちょっと調べてみましたが、空行に必ず半角スペースが入っているので、名前空間や参照に半角スペースの行が入ってしまい、エラーになるようです。こちらも対応できるでしょうか?というかここまで試してから報告すべきでしたね。何度もすみません。orz -- 金の髭? 2010-12-13 (月) 13:29:31
  • すみませんといいながら更にもう1つ・・・。質問箱などのように、投稿ごとにリンクというかラベルがつくようになると嬉しいです。 -- 金の髭? 2010-12-15 (水) 00:08:03
  • UI付きかっこいいです・・・今のところ金の髭さんのおっしゃる通りWikiからコピペするとスペースが入ってエラーを吐くようです。編集からコピペすると上手く動くようです。 -- K? 2010-12-15 (水) 00:20:06
  • 空白行のスペースを追加しないようにしてみましたが、firefox関連のなんらかの問題の対策用に空白行にスペース追加されていたようなので、もしかするとこの変更によってfirefoxでレイアウトが崩れたりするという問題があるかもしれません。 -- うp主? 2010-12-15 (水) 13:35:30
  • 対応ありがとうございます。お時間のある時で構いませんので記事ごとのリンク自動生成の件も対応していただければ幸いです。 -- 金の髭? 2010-12-15 (水) 22:32:52
  • とりあえず、原因とおぼしき部分は修正しましたが、なぜか最新の投稿のみアンカーがつかないようです。原因がわかり次第修正しますが、ちょっと時間がかかりそうです。 -- うp主? 2010-12-16 (木) 03:19:05
  • ありがとうございます。色々すみません。 -- 金の髭? 2010-12-16 (木) 08:26:31

(画像の文字列を入力して下さい)

キネティックタイポグラフィーとかに使ってほしいオートメーション

K? (2010-12-08 (水) 01:42:02)

オートメーションなのですがここに書いてよろしいのでしょうか・・・

キネタイをやったとき歌詞などのテキストレイヤーを一行一行追加していくのがめんどくさくなったのでつくりました。

テキストファイルを読み込んで、各行に分割してテキストレイヤーを作ります。

実行する前に
MainCode直下の
string compName = "Comp 2";
の部分を追加したいコンポジション名に書き換えてください。

あと読み込めるテキストの改行コードはCrLfのみとしました。

文字コードを判別するメソッドはまるまるパクリですw

+  コード


  • 長すぎですなwwwwごめんなさいw -- K? 2010-12-08 (水) 01:42:50

(画像の文字列を入力して下さい)

クロスフェード

(2010-12-06 (月) 03:05:24)

このエクスプレッションをはりつけたレイヤー同士のかぶった部分に、自動でクロスフェードをかけます。かならずフェードアウトするレイヤーのひとつ下に、フェードインするレイヤーをおいてください。
デフォルトでは、フェードインするレイヤーは実際にはフェードイン処理していません。透明部分があるレイヤーがフェードアウトする場合は、フェードインする側のレイヤーのエクスプレッションのfadeinの値をtrueに変更してみてください。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 
-
!
 
-
!
 
-
|
!
 
 
-
-
|
|
|
|
|
!
!
 
-
!
-
!
-
!
 
 
-
-
-
!
|
-
!
|
!
-
-
-
!
|
-
!
|
!
-
!
 
-
!
[MainCode]
//フェードインはデフォルトで無効(有効にするときはfalseをtrueに変更する)
bool fadein = false;

// エフェクトの不透明度のプロパティを取得
NumberProperty opaque = (NumberProperty)property.GetProperty(thisItem, "不透明度");

// クロスフェードさせる相手レイヤーを探す
// (自分のレイヤーの上下のレイヤーを探すだけ)
ILayer layer = (ILayer)thisItem;
ILayer fin = null, fout = null;
ILayer[] ls = layer.Composition.GetLayer();
for (int i = 0; i < ls.Length; i++) {
    if (ls[i].Equals(layer) == true) {
        if (i > 0)
            fout = ls[i - 1];
        if (i < ls.Length - 1)
            fin = ls[i + 1];
        break;
    }
}

// クロスフェード処理

// ワールド時間を求める
double wtime = layer.ToWorldTime(time);
// レイヤーの開始・終了時間のワールド時間を求める
double start = layer.Position + layer.InPoint;
double end = layer.Position + layer.OutPoint;

// フェードイン
if (fout != null && fadein == true) {
    // 相手レイヤーの開始・終了時間のワールド時間を求める
    double fstart = fout.Position + fout.InPoint;
    double fend = fout.Position + fout.OutPoint;
    // 重なっている部分があったらフェードイン処理
    if (start < fend && wtime < fend)
        opaque.DoubleValue = (wtime - start) / (fend - start) * 100;
} 
// フェードアウト
if (fin != null) {
    // 相手レイヤーの開始・終了時間のワールド時間を求める
    double fstart = fin.Position + fin.InPoint;
    double fend = fin.Position + fin.OutPoint;
    // 重なっている部分があったらフェードアウト処理
    if (fstart < end && fstart < wtime)
        opaque.DoubleValue = (end - wtime) / (end - fstart) * 100;
} 
// 0-100に丸める
opaque.DoubleValue = Math.Max(Math.Min(opaque.DoubleValue, 100), 0);

// 変更したプロパティを反映
property.SetProperty(thisItem, opaque);



(画像の文字列を入力して下さい)

フェードイン・フェードアウト

(2010-12-05 (日) 21:22:48)

不透明度のパラメータが存在するエフェクトまたはレイヤーの開始点から、終了点までの1秒にフェード処理を行います。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
-
!
 
 
-
-
|
!
|
-
-
!
!
 
-
!
 
-
!
 
 
-
!
 
 
-
!
[MainCode]
// フェードイン・フェードアウトにかかる時間(秒)
double fadeinterval = 1.0;

ILayer layer;
if (thisItem is IEffect) {
    // このエクスプレッションはエフェクトに適用されている
    // エフェクトのあるレイヤーの情報を取得
    IExpressionItem thisLayer = thisItem.ParentItem;
    layer = (ILayer)thisLayer;
} else {
    // このエクスプレッションはレイヤーに適用されている
    layer = (ILayer)thisItem;
}

// エフェクトの不透明度のプロパティを取得
NumberProperty opaque = (NumberProperty)property.GetProperty(thisItem, "不透明度");

// フェードイン処理
if (layer.InPoint + fadeinterval > time)
    opaque.DoubleValue = (time - layer.InPoint) / fadeinterval * 100;

// フェードアウト処理
if (layer.OutPoint - fadeinterval < time)
    opaque.DoubleValue = (layer.OutPoint - time) / fadeinterval * 100;

// 変更したプロパティを反映
property.SetProperty(thisItem, opaque);



(画像の文字列を入力して下さい)

サンプルいくつか

うp主? (2010-12-05 (日) 16:39:09)

投稿テストもかねていくつか。

レイヤーの位置にWiggleを掛ける

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 
-
!
-
!
-
!
-
!
-
!
-
!
 
-
!
 
[MainCode]
//ランダムシード
int seed = thisItem.GetHashCode();
//複雑度
int oct = 6;
//振幅
Vertex amp = new Vertex(100.0, 100.0, 100.0);
//振動の速度
double speed = 15.0;
//展開
float x = (float)((time * speed) % 360.0);
//位置のプロパティ
VertexProperty position = (VertexProperty)property.GetProperty(thisItem, "位置");

//ExpressionUtils.Wiggleを使って振動させる
position.VertexValue = ExpressionUtils.Wiggle(seed, x, oct, position.VertexValue, amp);
property.SetProperty(thisItem, position);


イージングを適用しつつ移動

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 
-
!
-
!
-
!
-
!
-
!
-
!
 
 
 
[MainCode]
//位置のプロパティ
VertexProperty position = (VertexProperty)property.GetProperty(thisItem, "位置");
//開始時間
double startTime = 0.0;
//終了時間
double endTime = 2.0;
//開始位置
Vertex startPosition = position.VertexValue;
//終了位置
Vertex endPosition = Vertex.Add(startPosition, new Vertex(640.0, 480.0, 0.0));
//加速度
double ease = 2.0;

position.VertexValue = ExpressionUtils.Ease(startTime, startPosition, endTime, endPosition, time, ease);
property.SetProperty(thisItem, position);


コンポジション内のレイヤーを円運動させる

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 
-
!
-
!
-
!
-
!
 
 
-
!
 
 
-
-
!
-
-
!
-
!
|
|
|
|
!
!
[MainCode]
//このコンポジション内の全てのレイヤー
ILayer[] layer = ((IComposition)thisItem.ParentItem).GetLayer();
//レイヤーごとの開始角度
double rad = 360.0 / (double)(layer.Length - 1);
//円の半径
Vertex radius = new Vertex(0.0, 200.0, 0.0);
//各軸それぞれの回転
double xMove = time * 180.0;
double yMove = time * 180.0;
double zMove = time * 90.0;
//位置計算用の行列
Matrix4D matrix = new Matrix4D();

for (int i = 0, c = 0; i < layer.Length; i++)
{
    //Nullオブジェクトやカメラなどを除く
    if (!layer[i].IsSpecialItem)
    {
        //行列を初期化
        matrix.LoadIdentity();
        //回転
        matrix.Rotate(xMove, yMove, rad * i + zMove, true);
        VertexProperty pos = (VertexProperty)property.GetProperty(layer[i], "位置");
        pos.VertexValue = Vertex.Add(pos.VertexValue, matrix.Transform(radius));
        property.SetProperty(layer[i], pos);
        c++;
    }
}


  • 追記: 円運動のエクスプレッションを使用する際は、Nullオブジェクトかなにかをコンポジションの一番下において、そこにエクスプレッションをコピペして下さい。 -- うp主? 2010-12-05 (日) 16:50:29
  • カメラを400x300x0から400x300x-1000までイージングを適用しつつ移動させたいんですが、上記のコードをコピペして適宜位置の値を変えて使えばよろしいのでしょうか? -- 2010-12-12 (日) 23:08:00

(画像の文字列を入力して下さい)

てすと

(2010-12-05 (日) 16:17:23)

テスト

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
-
!
-
|
-
|
-
|
!
!
//test
namespace Test
{
    class TestClass
    {
        static void Main(string[] args)
        {
            System.Windows.Forms.MessageBox("Hello World!");
        }
    }
}



(画像の文字列を入力して下さい)

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-02-27 (木) 23:04:43 (3932d)