3次元コンピュータ・グラフィックス(3DCG)の世界で,リアリティは非常に重要なテーマです。リアルな3DCGを作るため,これまで様々な研究/開発がなされ,その成果は映画やビデオ・ゲームなどで誰でも目にすることができるようになっています。そして,現在でもさらなるリアリティの追求のため,日々研究や開発が続けられています。このパートでは,そうしたリアルな3DCGの裏側にある技術の一端をお見せします。

 3DCGのリアリティは「形状」「色/質感」「動作」という三つの要素に分けて考えることができます。これらが技術的にどのような難しい点を含んでおり,どのように解決されてきたかは,最後のカコミ記事3DCGのリアリティを実現する三つの要素」を参照していただくとして,これらの三要素が一定の水準に達したところで浮かび上がってきた,ある問題に焦点を合わせてみましょう。それは自然な動作の大量生成が難しい,という問題です。ここでは,近年,特にめざましい成果を上げている動作のリアリティに関して,そのアルゴリズムとともに詳細を説明します。

動作をたくさんコピーしても群れにはならない

 3DCGが映画に使われるようになった当初は,ごく一部のキャラクタにのみ3DCGが利用されていました。そのころはもちろんそれで十分な効果がありました。例えば,1999年公開の映画「ハムナプトラ」では,主たるキャラクタのうちCGで表現されていたのはミイラだけでした。そのため,そのミイラを表現するために多くのコストをかけることができ,非常に品質の高いミイラを表現することに成功しています。

 これがもし,ミイラ以外にも実在しないキャラクタをもっと大量に表現しなくてはならないシナリオであった場合どうなるでしょうか。仮にミイラ軍団1000体を表示する必要があった場合を検討してみます。

 表示数が増えても,リアリティに重要なのが「形状」「色/質感」「動作」の三つの要素であることに変わりはありません。このうち「形状」と「色/質感」はコピーによっていくらでも複製できます*1。全く同じにしては違和感があるのなら,複製時に多少のゆらぎを与えて,少しずつ異なる形状と色/質感を持たせることもさほど難しくないでしょう。

 しかし,動作はコピーでは対応できません。1000体がそれぞれの状況に応じて異なった動作をする必要があるからです。単純にコピーすると皆が全く同じ動作をしてしまうので,軍隊の行進くらいにしか利用できません。

 だからといって,あきらめてしまっては映画を作ることはできませんし,脚本家や監督は技術的な限界に対して常に配慮してくれるわけではありません。この問題を解決するために,さらなる研究や開発が行われてきています。

 結論から言えば,すでにある程度の解決策が施され,多くの映画やビデオ・ゲームでその成果を確認することができます。

 先に挙げたハムナプトラに関しては,その1作目の公開から2年後には続編「ハムナプトラ2」が完成しています。その中では大量の魔物軍団が人間の軍隊と戦うシーンが3DCGによって作成されています。もちろん,すべての魔物が同じ動作をしているのではなく,軍隊としてみた場合に違和感のない動作を行っています。このような大量の動作データが一体どのようにして作られたのかを説明しましょう。

群れでは「移動」の要素を大量に作成する必要がある

 まず,「動作」というものを分解してみましょう。例えば,人間が歩く動作は,腕や足を動かし,その結果として位置が変わると解釈できます(図1)。動作のうち,腕や足を動かす一次的な動きを「基本動作」,そして基本動作によって発生する位置の変化を「移動」と呼ぶことにします。

図1●動作は二つに分解できる
図1●動作は二つに分解できる

 どのような移動のパターンでも,歩いて移動する場合,腕を振って足を上げてという基本動作には大差がありません。つまり,動作を構成する要素のうち,基本動作に限っては,コピーの手法を利用できます。すると,あとは移動の要素を大量に作成する方法を検討すれば良いことになります。

 CGではこの大量の移動データを「群れの生成」という手法で作成することがあります。群れとは,鳥や魚,動物たちが集団で行動する様子を意味しています。この群れの生成が大量の移動データの生成方法と同じ意味を持っています。

 群れの生成に関しては,Craig Reynolds(以下,レイノルズ)が1987年のSIGGRAPH*2で研究成果を報告した『Flocks,Herds,and Schools:A Distributed Behavioral Model』の論文が大変有名であり,先駆的でもあります*3。レイノルズは論文以外にも,映像としてその研究の成果をSIGGRAPHの「Electric Theater」の中でビデオ映像として発表しています。レイノルズのWebサイトでは実際に動作する群れのデモも見ることができます。以下ではレイノルズの論文をもとに,群れの生成をどのようにして行うのかを説明します。

各個体を自律的に移動させる三つの基本ルール

 レイノルズは群れを構成する鳥や魚などを表すオブジェクト一つひとつが自律的に行動するものとしたうえで,各オブジェクトが群れを構成するための三つの基本ルール(アルゴリズム)を提案しています。それぞれSeparation(分離),Alignment(整列),Cohesion(結束)と呼ばれています。

 群れを構成するのは,特定の群れの構成メンバーであると決められたオブジェクトたちです。特定の群れに所属するメンバーだけが寄り集まって群れを構成することができるのですが,この同じ群れに所属するメンバーすべてが群れを構成するとは限りません。というのは,ある時点で群れからはぐれてしまうオブジェクトもあり得るからです。

 つまり,ある群れの構成メンバーになるということは,必ず群れの中にいるということではなく,「ほかの構成メンバーと群れになることができる」程度のゆるやかな拘束条件でしかありません。プログラム起動時には,同じ群れのメンバーがはぐれない程度の距離を持たせてから,三つの基本ルールに従って計算処理を開始します。

 一つ目のルールであるSeparationは,群れを構成している特定のオブジェクトが,ほかのどのオブジェクトに対しても一定の距離を保つための行動です。近づき過ぎたオブジェクトから離れて,群れが塊にならないようにします。二つ目のAlignmentは,群れを構成している特定のオブジェクトが,自分の進行方向をほかのオブジェクトと大体同じ方向に合わせようとする行動です。周りと同じ方向・速さで行動することで,群れがバラバラにならないようにするわけです。三つ目のCohesionは,群れを構成している特定のオブジェクトが,ほかのオブジェクトの平均的な位置に移動しようとする行動で,互いに寄り集まるための行動です。

 これらの基本ルールは,いずれも常に群れのほかの仲間を評価していることに注意してください。というのは,この仲間をどのように定義するかも重要だからです。仲間を選別するためには,自分から一定の距離の中にいるものとして定義されるべきです。つまり,自分を中心にした球体の中に入っているオブジェクトを仲間として評価し,その仲間の状態から次の自分の状態を計算するようにします。私が群れを初めてプログラミングした際には,この仲間の定義を,群れを構成しているすべてのメンバーとしてしまいました。その結果,大きな群れになるほど計算負荷が増え,得られた結果も満足できるものではありませんでした。

 また,多くの生物は真後ろには視野がありませんので,後ろ方向は評価対象外の領域とすべきです(図2)。この方法によって,群れの大きさやオブジェクトの数にかかわらず評価対象の仲間の数はある程度の範囲に収まります。この領域内に仲間がいなくなったときは,群れからはぐれた状態となります。無限空間を移動している場合には再度仲間と巡り合う機会は減りますが,実際のアプリケーションでは有限空間の中に群れを発生させますので,再度仲間に巡り合う可能性は十分にあります。

図2●群れの「仲間」を定義する領域
図2●群れの「仲間」を定義する領域