2017年2月7日
映画制作におけるPython
(2016-11-30)by Dhruv Govil
本記事は、原著者の許諾のもとに翻訳・掲載しております。
Python は、近年、映画を作成する上で不可欠なものになってきているプログラム言語の1つです。スクリーンに絶大な効果を与えることになるPythonを活用していない長編アニメーションやVFXを用いた映画はほとんどないと言っていいでしょう。
映画について考える際、プログラマは映像を生み出す芸術性について考えることがあります。しかし、映画業界の技術面を気にする人はほとんどいません。
そのようなこともあり、これまで幸運にも私が携わることのできたいくつかの有名な映画でどのようにPythonを使用したかを記事にまとめ、ブログに投稿してきました。これにより、Pythonがどれだけ映画全般に貢献しているかを示すことができれば幸いです。
また、最近私は、アーティストに Python For Maya(Mayaで使うPython) のオンライン講座を udemy に公開しました。この業界でのスキルの重要性が高まってきているためです。私が投稿してきたブログは、この講座への手引書としても役に立ちます。
前置きはこのくらいにして、先に進みましょう。
Pythonとは?
Pythonに馴染みのない方もいるかと思います。
Pythonは、簡単に読み書きができるようデザインされたプログラミング言語で、長編映画業界のみならず、数学、科学、機械学習といった分野で非常に人気があります。
Pythonについて、詳しく学習したい方は 公式サイト をご覧ください。
なお、重要な点として、映画業界ではPython 3ではなくPython 2.7が主に使われています。Python 2は積極的な開発がすでに行われていませんし、Python 3には多くの役立つ機能があるのですが、大々的なコード開発はPython 2で行われてきたこともあり、現段階でバージョンを切り替えるのは容易ではないのです。
長編映画のパイプライン
Pythonは、長編映画のパイプラインで最も活用されます。
以下の図は、主要な映画製作会社でのパイプラインを説明したものです。
各部門をつないでいる矢印が パイプライン で、部門間でデータが滞りなく受け渡しされ、関係者全員が協力して作業ができることを確認する役割があります。また、各部門でのツールセットの責任も担っており、アーティストが効率よく仕事ができるようなっています。ここでは、部門間のフローに注目して見ていきましょう。
Pixarが作成した『レミーのおいしいレストラン』のメイキングで、この図をより可視化したデモがご覧いただけます。
この映像には、ビジュアルエフェクトまたは長編アニメーション映画における、様々なワークフローのステージがあったのがお分かりになったと思います。制作会社により多少異なりますが、これが一般的なフローです。
絵コンテやフィルム映像、プリビズは、初期段階で用意されるデータで、最終的にコンポジットやライティングを行って映像を仕上げます。
ビジュアルエフェクトが施された映画の場合、プレートのフィルム映像に含まれた追加要素への処理が必要となるので、アニメーション映画の場合とは事情が少し異なります。
パイプラインは、部門間でのデータの受け渡しに対して責任を負っています。以下はパイプラインがどのように機能するかをまとめたものです(上記で説明したものよりも本質的なプロセスとなっています)。
- クライアントもしくはストーリーアーティストからシーンの状況が分かるプリビズ、または絵コンテをプレートのデータで入手します。
- モデリング が対象とするのは全てのデータで、必要とされる全てのアセットの3Dモデルを作成します。
- リギング でモデル化されたキャラクターのアセットにバーチャルのスケルトンを適用し、動かす仕組みを作ります
- マッチムーブ で実際のカメラの動きとマッチするバーチャルのカメラや、動かないキャラクター、またはジオメトリなどを作成します。
- レイアウト ではリグを取り込み、独自のカメラを作成するかマッチムーブカメラを取り込み、シーンの配置を決めます。実写版で言うと、撮影監督に似た役割を担っています。
- そして俳優と同等の役割を持つ アニメーション へとシーンが持ち込まれます。キャラクターの動作を担当し、アニメーション化されていないスケルトンに命を吹き込みます。
- キャラクターエフェクト では、アニメーションの技術部分を担当します。筋肉のシミュレーションや本物と同じような服、髪、草木の動きなどは、全てキャラクターエフェクトが担っています。
- エフェクト では、アニメーションではないアセットに関連したエフェクトを扱います。破壊音や爆破音、ボクセル化など、エフェクトが担当する作業はたくさんあります。
- 一方、__テクスチャリング**では、3Dアセットへの色付けを担当します。色付けすることで灰色だけだった被写体が多色になります。
- シェーディング で色付けをしたアセットに質感を設定し、どの程度の陰影が適切かを判断します。
- マットペインティング は、合理的ではないなど構築するのが難しい環境を作成する部門です。現実的に構築できるものには限度があるため、こういった場合は、誰かにクオリティの高いペインティングをしてもらったほうが効率的なのです。
- これらの作業を終えたら ライティング へと持ち込み、映像に光を加え、レンダリングを行って映像を書き出します。また、映像の質を高めるためにちょっとしたコンポジットも行います。アニメーション映画の場合は、これが最後の作業となります。
- ビジュアルエフェクトの場合は、不要な要素を取り除いたり、ノイズの削除、または歪みを取り除いたりしてプレートを準備しなければなりません。これは、 RotoPaint としても知られる Plate Prep で処理されます。
- 最後に コンポジット では、全ての映像とレンダリングしたCG画像を実際のフィルムプレートへと統合します。ビジュアルエフェクトではこれが最後の作業となります。
私たちはこれらの作業を連携するのにPythonを使用しています。
次の項目では、まずパブリッシングに触れて、その後、各部門でPythonがどのように使われるのかを説明します。
長編映画のケーススタディ
ここでは私が携わった映画とこれらの映画でPythonがどのような役割を担っていたかを書いた記事を紹介します。
パブリッシングについては、ケーススタディの後に続きます。
『スーサイド・スクワッド』
映画そのものはイマイチかもしれませんが、この作品で私たちはいくつかの素晴らしい仕事をしました。
続きを読む
『モンスター・ホテル2』
『モンスター・ホテル2』とこの映画で私たちが行った仕事をおさらいしてください。
続きを読む
『アメイジング・スパイダーマン2』
私が最初に携わったスーパーヒーロー映画を振り返ってみましょう。
続きを読む
『くもりときどきミートボール2 フード・アニマル誕生の秘密』
私が最初に携わった長編アニメーション映画を振り返ってみましょう。
続きを読む
『パーシー・ジャクソンとオリンポスの神々:魔の海』
私が携わった最初の長編映画から勉強してください。
続きを読む
パブリッシングとアセットマネージメント
これはまさに、従来のパイプラインの中核となる部分です。部門間でアセットが共有されているか、追跡されているかを確認します。
まずは、アセットのパブリッシングからです。
部門が担当する作業が完了し、パブリッシングできると判断されたら、次の部門が仕事を引き継ぎます。例えば、モデリング部門ではモデルをエクスポートします。では、アニメーション部門ではアニメーションをエクスポートするのでしょうか? それは誰がこれを引き継ぐかによって異なります。
ジオメトリの場合、私たちは Alembic を使用して、ジオメトリキャッシュとして単にパブリッシュすることがよくあります。AlembicはImageworksとILMによって開発された業界標準の共有フォーマットなのですが、こうすることで、一貫性のあるキャッシュフォーマットにすることができます。
点群データの場合は、Alembicもしくは OpenVDB を使用し、 TIFFファイル形式の画像の場合は OpenEXR を使用します。
もう少しすると、 OpenUSD と呼ばれるPixarが使用しているユニバーサルシーン形式が、業界での標準となってくるでしょう。
とにかく、簡単に置き換えができつつ、可能な限り最も効率的な形式でデータを保持するというのが、本来の意図です。キャッシュデータは多くの場合で最適な形式と言えます。なぜなら、安価なI/Oのヒットだけで済むからです。それに対して変形のヒットは高くつく可能性があります。
しかし、これは非常に複雑になります。アーティストはデータの出所や、データが届いた過程など知る必要はありません。データを読み込むことができ、パブリッシュができればいいのです。
これがパイプラインです。私たちはこれらを行うのに非常に使い勝手の良い、UIとツールを開発しました。
データをパブリッシュするには、ユーザはいくつかのテストに対してアセットの検証を行ってくれるパブリッシュのUIを単に開けばいいだけです。そして、オープンフォーマットが行われる仕様へと変換するマシンのセンターにデータを送信します。
パブリッシュデータを取り込むには、こちらも単にアセットブラウザを使用し、選択したいアセットをアーティストに選ばせるだけです。稀にサムネイルやディスクリプションが表示されることがありますが、ほとんどのアーティストにとってこれらの詳細は重要ではありません。
これらのパブリッシングやアセットマネージメントシステムは、様々なアプリに共通している必要があるので、私たちはこれらをPythonとPt (PyQTまたはPySide)で開発しました。これにより、各アプリケーションに対して再度コンパイルをすることなくコードを再利用することができ、必要に応じて迅速に機能を追加することが容易になります。
これはどの部門にもほぼ共通しているので、それぞれで繰り返すしせず、ここで各セクションに許可を与えることにしました。
これは、多くの映画制作会社が独自に開発したものに類似したオープンソースのパブリッシングシステム、 Pyblish です。
Blenderで作成されたショートムービー『Big Buck Bunny』のワイヤフレームを見ると、モデルがポリゴンで構成されているのが分かります(各四角形がポリゴンです)。
モデリング
モデリングは、他の全ての部門で使われる3Dソースジオメトリの作成を担当する部門です。
多くの場合、ジオメトリの配置や編集、または場面の管理という点において、繰り返し作業がかなりの回数に上ります。
Pythonが役に立つのはこの部分です。ほとんどの3DパッケージにはPython APIが含まれているため、手動で行う全てのことをプログラム可能です。
つまり、簡単なアセットに10分を費やす代わりに、この作業工程をスクリプト化すれば、次に必要になった時にクリックするだけでいいという環境を作れます。この10分の節約は、プロジェクトの工程全体で見ると数百時間の節約につながるはずです。この時間は、芸術的な感性を要する、より複雑なアセットに充てることができます。
例えば私のコースでは( Python For Maya )、Pythonを使ってシンプルな歯車を作成し、同様にUIを作成して、歯車の歯数と長さを指定することができるようにします。
ただし、これについては、Pythonを使ってカスタムのデフォーマやインタラクティブツールを作成する場合、以下の Hans Godard のデモ映像でも分かるように、より複雑になる可能性があります。
Vimeo に公開された Hans Godard の Plugin and Nodal Demo Reel 2016
リギング
リギングでは、実際の人間と同じように形を変えることができるようキャラクタージオメトリのスケルトンを作成します。
しかし、これだけでは十分な説明とは言えません。
リギングでは基本的に、キャラクターに命を吹き込むためにアニメーターが使用するインターフェイスを作成しますが、動きが自然であるかの確認も行います。
つまり、アニメーターがキャラクターの腕を動かすと、リガーは肩が適切に変形しているかを確認しなければなりません。
リギングにおいてPythonは重要な役割を果たしています。以下はその使用例の一部です。
- リグの自動ビルドを作成する。コードを使ってリグを構成することで、全てを手作業で行うのではなく、作業工程の再利用が簡単になります。
- アプリケーション非ネイティブの作業を、カスタムデフォーマやノードを開発して実行する。
- モードとコントロールの切り替えなど、アニメーターをサポートするためのスクリプトを開発する。
私のコースでは( Python For Maya )、コントローラのライブラリを作成します。コントローラは、名前からも分かるように、アニメーターがリグをコントロールするために使うオブジェクトです。ジオメトリを直接使用する代わりに制御ポイントを使ってスケルトンを動かし、それによってジオメトリが変形します。
私はQtを使ってユーザインターフェイスを開発し、コントローラを外部保存してインポートで簡単に再利用できるようにしています。
リギングの学習に興味がある方は、 Animator Friendly Rigging もチェックしてみてください。業界の多くのリガーもこれを使って学んでいます。
ティーザー映像: Vimeo に公開された Fabric Engine の Siggraph 2016 Kraken Workshop
KrakenはFabric上に構築されたリギングフレームワークですが、フロントエンドのUIにPythonが使われています。
Stop Staring は顔のリギングとモデリングに関する本で、これもリギングの優れたリソースです。
アニメーターのリグの使い方、および使用するツールの種類を示すデモ映像
アニメーション
アニメーションは、皆さんに一番馴染みのある部門です。動きのないリグに動きと生気を与えます。基本的には、実写版でいうところの俳優と言ってもいいでしょう。
ご想像の通り、アニメーターは多くの反復作業を行う必要がありますが、Pythonのスクリプトでこれを代行したり軽減したりすることが可能です。
以下にその例を挙げます。
- コントローラを選択する。複雑なリグには、何百もの制御ポイントがあり、ビューが乱雑になることがあります。ピッカーのインターフェイスのユーザフレンドリーなUIにより、アニメーターは、実際のビューで制御ポイントを隠しながら選択することができます。
- 特に中間点にキーを作成する。2Dの時代のアニメーターは、中間のキー(ポーズ間に動きを与えるキー)を、あるポーズに向かう重みとして定義したでしょう。3Dの時代では、例えば「新しいキーに、従来のキーの30%の重みを加えたい」と考えるようなアニメーターをサポートするツールを作ることができます。
- 拘束を設定する。キャラクターがオブジェクトを拾い上げると、その時点でアニメーターは両者が一緒に動くようにキャラクターとオブジェクトを拘束する必要があります。こうした共通タスクの管理を処理するツールを使うことで、作業を簡略化することが可能です。
私たちはこうしたツールの多くをPythonで開発しており、ほとんどのインターフェイスはPyQtまたはPySideのいずれかを介したQtを使って開発しています。
私のコースでは( Python For Maya )、スライダをドラッグして2つのポーズ間のキーの重みを選択できるようにするTweenアニメーション用のUIを作成します。
キャラクターエフェクト
キャラクターのアニメーション化は終わりましたが、場面により深みを与える筋肉や髪の毛や服装などといった技術的な問題点についてはまだ考慮の余地があります。
『塔の上のラプンツェル』の風に揺れるドレスや『モンスター・ホテル2』のクレイジーな髪の毛、あるいは『スーサイド・スクワッド』の筋肉シミュレーションなどは、全てキャラクターエフェクト部門で処理されています。
他の部門と同様、この部門でもPythonは幅広く活用されています。
以下はその例です。
- シミュレーションを設定する。
- 複数のテイクのシミュレーションを組み合わせる。
- 新しい作業ワークフローを作成する。
見過ごされがちですが、キャラクターエフェクトはスクリーン上でリアルさを表現するために、なくてはならないステップです。
『モンスター・ホテル2』の服装がどのようにシミュレートされたかを示す舞台裏の映像
Vimeo に公開された Method Studios の 2016 AICP Sponsor Reel – ディレクターズカット版
このビデオは、入力モーションキャプチャデータで手続き型エフェクトを生成するHoudiniを使って作成されました。
エフェクト
エフェクト部門が担当するのは主に手続き型エフェクトで、キャラクターエフェクトとはまったく異なります。
建物の破壊、爆発、魔法の粒子、さらには海全体、こうしたものに動きを与えるのがエフェクト部門です。
ここでも、例えば手続き型エフェクトグラフの設定やパラメータの記述など、手作業では時間がかかる多くの工程においてPythonが使われています。
Pythonを使用して手続き型ノード全体を作成すれば、興味深い効果を生み出すことも可能で、非常にパワフルなツールと言えます。
ライティング
これで3Dジオメトリが全て作成されたので、画面で表示できる画像に変換する必要があります。しかし、もしこのまま変換をすると画面は真っ暗になるでしょう。
ライティング部門は場面に光を追加し、映画として面白く見せることを担当しています。その場面のムードを決めるのは彼らの仕事で、何も起こっていなくても、暗くすれば陰鬱に、明るくすれば幸せで活気に満ちた映像になるはずです。
場面の中には多くの光とたくさんの3Dアセットが含まれることがあるため、ここでもPythonは大活躍です。UIを作成すれば、これらの場面の管理が容易になります。
例えば数十億、または数兆のオブジェクトを持つような場面も、シンプルなユーザインターフェイスで対応可能です。
私のコースでは( Python For Maya )、PyMelとQtを使ってライティングマネージャを作成し、場面内の全ての光を制御するUIを作り上げます。また、それらを場面間または制作者間で共有できるようJSONファイルとしてインポートおよびエクスポートする方法にも触れます。
ライティングが終わると、ついに場面を画像に変換します。この作業に使うのは、Arnold、Renderman、Vrayなどのレンダラです。
Vimeo に公開された Pixar’s RenderMan
RendermanはPixarが開発したレンダリングエンジンであり(実際には映画会社としてPixerが設立される前から開発されていました)、多くのスタジオで使用されています。
非商用目的で利用 する場合、こちらのリンクからダウンロード可能です。
全ての結果がどのようにまとめられるかを示す例
コンポジット
工程の最後を受け持つのがコンポジットです。
ここでは、最終的な映像とレンダリングされた素材(存在する場合)を集めて一緒に組み合わせます。ただし、全てのパーツが適切に統合され、連続的なイメージに見えるようにしなければならないため、単に組み合わせればいいわけではありません。
多くの人はビジュアルエフェクトという言葉で、ど派手な爆発や不条理な生物などを想像しがちですが、背景の配置や群衆の追加などといった微妙なこともその範疇にあるのです。
『フォレスト・ガンプ』のような一見シンプルな映像に、どれほど多大な作業が費やされているのか、把握できる人はそう多くないと思います。
コンポジットでもPythonの有用性は変わりません。
Nukeのようなアプリケーションで合成ノードグラフの設定を自動化できる他、 OpenColorIO やPillowのようなライブラリを使えば画像処理全体を行うことも可能です。
また、Computer VisionでPythonを使えば、場面内のオブジェクトを追跡できるようにもなります。
その可能性の高さには本当に興奮させられます。
最後に
このブログの記事を通じて、プログラミングがいかに今日の映画にとって不可欠であるか、より具体的には、Python自体がいかに有用であるかを示すことができれば幸いです。
Pythonを使うことで、動きのあるオブジェクトの複雑な関係性をよりシンプルにできますし、各部門の作業効率を上げることができるようにもなります。
アーティスティックなプロセスとは言えませんし、直接的な結果を画面で確認できるわけでもないので見過ごされがちですが、近年ますます複雑になってきた映画制作において、その存在はますます大きくなっています。
株式会社リクルート プロダクト統括本部 プロダクト開発統括室 グループマネジャー 株式会社ニジボックス デベロップメント室 室長 Node.js 日本ユーザーグループ代表
- Twitter: @yosuke_furukawa
- Github: yosuke-furukawa