株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • プローシージャルアニメーションで簡単カット作成

プローシージャルアニメーションで簡単カット作成

2012/12/10

Tag: ,,,

[ごあいさつ]

はじめまして。アシスタントTDの 護守(ごのかみ) です。
「ごのかみ」って書きにくいので「ごの」とか略してもらってもいいですよ。
DFにご厄介になってまだ半年ほどですが、MassiveとTDワークを担当しております。
周りの皆さんが非常にできる方ばかりな上、勉強することが多く四苦八苦している現在です。
他のスタッフの方々のように有益な情報をご紹介できるかどうかわかりませんが、
お時間ある方はお付き合いください。

最近はスクウェア・エニックス様(以下スクエニ様)のオープンカンファレンスが楽しかったですね。
刺激を受けて創作意欲がわいてきました。
プリレンとリアルタイムの垣根が薄くなってきた昨今を鑑みると、
こちらの業界でもスクエニ様のような技術というのは必要になってきますからね。

さてさて話は全然変わりますが、僕は3DCGの中でもアニメーションの分野が一番好きなんですね。
しかし、作業していると機械的にやってほしいとことかが出てくるんですよね。
そこに時間割かれると、アニメーションのクオリティアップの時間が削られてしまうので、
そういったところを手でやるというのがあまり好きではないんですよ。
そこで、そのめんどくさいことを省きつつアニメーションを作れるということで、
プロシージャルアニメーションに注目しております。

というわけで、今回のテーマは

「プロシージャルアニメーションを使ってそれっぽいカットを簡単に作る」

です。

今回お話するプロシージャルアニメーションとは、人型キャラに適用できるものではなく、
オブジェクト自体のアニメーションに関わるシンプルなものなのであしからずです。
それからオペレーションにはmayaを使っております。

※注意※ 本記事内でダウンロード可能なツール、コードを使用したことによって
引き起こるいかなる損害も当方は一切責任を負いかねます。
自己責任でご使用ください。

 
 
 

[ぷろしーじゃるあにめの基礎の基礎]

プロシージャルアニメーションって書くと、なんだかすごい複雑なこと
やっているんだろうなぁとか思われるかもしれませんが、実はそんなことありません。

y = sin x


これは中学校でも習った、sin関数ですね。
はい。これでプロシージャルアニメーションです。

…( ゚Д゚)
…(゚Д゚)

唐突過ぎますね。もうちょいわかりやすく説明します。

てけとうにcubeを作ってexpressionにこの数式を適用してみます。

pCube1.tx = frame;
pCube1.ty = sin(frame);

これで再生すると先ほどのグラフのように動きます。
(クリックで再生)

オブジェクトに数式を与えることで、自動でアニメーションをつけてくれます。
これがプロシージャルアニメーションなわけですね。

さて、これをちょっと応用した数式に変えて、見栄えをよくしてみましょう。
どうせやるなら楽しくです。
ちなみに、ここからはスクリプトエディタ(python)で実行します。

# -*- coding: utf-8 -*-
import pymel.core as pm
import random


def spiralUpper(numCubes):
    yspeed = 0.2    # y方向の速さ
    interval = 0.5  # オブジェクト同士のインターバル
    
    startFrame = 0
    for i in range(0, numCubes):
        obj = pm.polyCube()
        
        a = random.uniform(6.0, 14.0)   # 軸からの距離
        b = random.uniform(11.5, 12.5)  # 回転する速さ
        c = random.uniform(-0.1, .1)    # 軸のオフセット
        
        expstr = ""
        expstr += "$t=frame+" + str(startFrame) + ";\n"
        expstr += "tx=" + str(a) + "*sin($t/" + str(b) + ")+" + str(c) + ";\n"
        expstr += "ty=$t*" + str(yspeed) + ";\n"
        expstr += "tz=" + str(a) + "*cos($t/" + str(b) + ")+" + str(c) + ";\n"
        
        pm.expression(object=obj[0], string=expstr, n="sincos_exp1")
        startFrame += interval

spiralUpper(400)

スクリプトエディタでこれを実行します。
で、後は再生するだけです。

(クリックで再生)

数を増やしただけでも、さっきよりは見ごたえのあるものになりましたね。
このスクリプトでは、選択したオブジェクトにsin関数とcos関数のexpressionを
自動で書き込んでいます。なので、エクスプレッションエディタで確認してもらうと
何が書いてあるのかわかるはずです。

ちなみにオブジェクトが整然としないように、ここではあえてランダム値を入れてます。
spiralUpper(400)←この数字はcubeの数です。暇があったらここの数字部分も変えてみてください。

ポイントその壱: 単体のアニメーションは微妙でも物量出せばそれなりに見れる
 
 
 

[数式作るのめんどい…]

というわけで、数学関数さえ当てはめてあげれば、プローシージャルアニメーションが
できるというのがわかったと思います。
でも、ここで問題が。
sin関数やcos関数などの比較的動きが予測できる関数は制御しやすいんですが、
それ以外の複雑な関数って作ってみないと動きがわからないですよね。
それに加え、基本的に数値での調整が主になるので扱いにくいんです。

というわけで、手でアニメーションをつけちゃいましょう

支離滅裂だと思われるかもしれませんが、怒らずにお付き合いください。
アニメーションというのはやはり手でつけるのにはかないません。
自分の思い通りのアニメーションを思うとおりに作れるわけですから。
今回ご紹介しているプロシージャルというのは
冒頭でも述べたように、「機械的にめんどくさいところを短縮する」というのが目的です。
手でアニメーションをつけるための補助的な手段でしかないのです。
ですから、手でつけた方が結果的に早くなるならそうするに越したことはないわけです。

では、この節では何をご紹介するのかと言うと、
ひとつのオブジェクトにアニメーションをつけるだけで見栄えを良くする方法 です。

ここでポイントその壱を思い出してください。
物量あれば、それなりに見栄えよく見えるんです。
一個にアニメーションをつけて、それに他のオブジェクトを追従させるだけでも
それっぽいものになるんですよ。
 
 

やり方をひとつひとつ書いていくと記事が長くなりそうなので、ツールをつくりました。
delayLocus.py
※備考※ 使用方法はファイル内にも記述してあります。
0フレームで位置がリセットされます。

このツールでやっていることは簡単です。
アニメーションがついているオブジェクト(以下、オリジナルオブジェクト)の
前のフレームの位置を記憶しておいて、現在のフレームとの差異分だけ
ツールが適用されたオブジェクトを動かしてます。
フレーム単位で記憶しているので、毎フレーム再生にしないとうまく動かないです。
あとexpressionで強引にやってるので数が増え過ぎると重くなるので注意です。

[使用方法]
    1. C:\Users\ユーザー名\Documents\maya\mayaバージョン\scripts にこのpythonを置く
    2. maya上でpythonコマンド import delayLocus を実行(2回目以降は reload(delayLocus) )
    3. 縦横の数を指定して、サンプルオブジェクトを作成
    
    4. ひとつのオブジェクトにアニメーションをつける
    
    5. 追従させたいオブジェクトを全て選択して、アニメーションさせたオブジェクトを最後に追加選択
     ※全選択して、オリジナルオブジェクトを選択解除→選択とすると楽
    
    6. AddAttrを実行(offsetアトリビュートが追加される)
    
    7. 先程のを選択したままで、delay Locusを実行
    
    8. 再生する

[備考]
    ・オリジナルオブジェクトのオフセット値を変えて再生することで、
     追従するオブジェクトの遅れてくる度合いが一括調節できます。
    
 

で、こちらを使ったのがこのサンプルです。

けっこう楽しくなりましたね(=゚ω゚)

自画自賛みたいであれですが、使ってて楽しいですね、これ。
暇があったらもう少し遊んでみたいです。
 
 
 

[カット作成]

さてアニメーションもできたのでサクッとレンダリングしてみましょう。
ここで用意するものはHDRIのみです。
ネットに落ちてるので適当に探してみましょう。(擬似HDRIもあるので注意)
自分で作成するのも意外と簡単にできたりするのでオススメです。

ポイントその弐: Imaged Based Lighting(IBL) を使えば簡単にライティングできる

IBLってなんぞやという人に軽く説明しておきます。
IBLとは画像を光源とみなしてライティングするものです。
フォトリアリスティックなライティングを簡単にできるのが特徴です。
そこでライティングに使うため、広い輝度情報を持つHDRIが必要なわけです。

レンダラーをメンタルレイに変えてIBLを作ります。

そこに先程のHDRIを貼り付けます。では、レンダリングして確認してみます…

おっとその前に、 Enable Default Light を切って、
Final Gathering を有効にしてください。
じゃないと IBL の効果が出ないので注意です。

いいライト具合になるように Color Gain や Color Offset で調整します。
このとき背景が変な感じになっても気にせず、
オブジェクトのライティングのみに着目してください。
これはあくまでライティング用に使うだけなので後で背景はオフにします。
ちなみに、IBLの Primary Visibility をオフにすると背景が消えるので見やすくなりますよ。

ライティングが終わったら背景用の球を用意します。
IBLと同じ大きさの球を用意してそこに同じHDRIを貼り付けます。
後はカメラを決めてから、レンダーレイヤーなんかを使って
オブジェクトだけ、背景だけをレンダリングします。

最後に合成すればこんな感じになります。

 
 
 

[後記]

物量出すならパーティクルでやればいいじゃん
という至極ごもっともなご意見があるかと思いますが、
こうやってオブジェクト自体をいじるのも楽しいですよってことも言いたかったのです。
実際の使い道はあまりないかもしれません。
しかし、割と簡単に作れることがわかったと思いますので、お時間ある方は遊んでみてください。

ちなみに、このムービーで使っているオリジナルオブジェクトのアニメーションは
重力とバウンドの数式を使って作っております。こんなこともできますのでご参考までに。

しょうもないツールですが、これを使って作品など自由に作ってもらってかまいません。
作品を発表する場合はDFか僕のクレジット入れてくれたり、報告してくれたりすると
嬉しいなぁとか何とか思ったり。

それでは今回はこのへんで_(:зゝ∠)_

Pocket

コメント

[…] 第一回:プロシージャルアニメーションで簡単カット作成 第二回:プロシージャルでライトニング(稲妻)     […]

1 thought on “プローシージャルアニメーションで簡単カット作成”

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*