2024年4月26日(金)に開催されたリガー向けのリアルイベント「リグナイト超(スーパー)」。リブゼント・イノベーションズ BACKBONE事業部の福本健太郎氏が開催してきた全員参加型の勉強会「リグナイト」の、約4年半ぶりのオフライン開催だ。イベントは「ライトニングトーク」「懇親会」「座談会」で構成され、登壇者には現在各分野の第一線で活躍するリガーが集結した。
本記事では、登壇者によってリグに関する多様な知見が共有された、ライトニングトークパートのレポートをお届けする。
なお、リブゼント・イノベーションズ BACKBONE事業部の「リグブログ」では、イベント後半の座談会の様子がレポートされている。
Qtを活かしたジョイント作成・補助機能
小森俊輔(Eske Yoshinob)氏
フリーランスCGデザイナー
リギングやツール制作、パイプライン構築などに従事。自身のプロジェクトや身内向けでリギング用ツール群「GRIS」の開発なども行う。2016年にMayaのテクニカル向け漫画「マヤ道」をEske Yoshinob名義で執筆。同Eske名義でプラモデルのパッケージアートやヴァーチャルライブのアートディレクションなども行う。
twitter.com/shunsuke_komori
twitter.com/EskeYoshinob
ライトニングトークのトップバッターを務めた小森氏からは、ジョイントの制作・配置のためのツールにQt(キュート)の機能を活用するテクニックが3種紹介された。Mayaでは2011年より開発フレームワークにQtが採用されており、Python経由でQtの機能を利用したさまざまな拡張が可能となっている。
ボタンの機能拡張
まず取り上げたのは、ボタンに関する拡張。ボタンを押したらジョイントが作られるという簡単な作例が紹介された。この時点で‟なにも選択しないで実行”と‟骨を選択した状態での実行”、ふたつの機能を提供している。ここまではボタンをクリックしたらMayaの機能を呼び出す、という機能だ。
「この状態から、さらに別の動作も実行させたい場合にはどうしたらいいでしょうか?ここでQtの機能の出番です。QPushButtonクラスをオーバーライドしてカスタムクラスを作ります。"MousePressEvent"をオーバーライドし、通常クリック時と右クリック時で別々のシグナルが呼ばれるようなしくみにすることで、同じボタンで第2の機能を設けることができます」(小森氏)
MousePressEventはQtWidgetsに備わっているメソッドで、QPushButtonをはじめとするQtWidgets以下のクラスで利用できる。これをオーバーライド(クラスの中で再定義)することで、ボタンクリック時の挙動をカスタマイズできる。
今回の実装例は、ifで押されているのがRightButtonかどうかで分岐させるだけ、というシンプルなものだ。同時に、通常のクリックであるclickedシグナルに対する‟rightButtonClicked”シグナルも追加しておき、‟right button clicked”‟Left Button Clicked!!!!”とプリントするテスト用関数とそれぞれコネクトした。
from PySide2 import QtWidgets, QtGui, QtCore
from maya import OpenMayaUI
import shiboken2
maya_window = shiboken2.wrapInstance(
int(OpenMayaUI.MQtUtil.mainWindow()), QtWidgets.QMainWindow
)
class MyButton(QtWidgets.QPushButton):
rightButtonClicked = QtCore.Signal()
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.RightButton:
self.rightButtonClicked.emit()
else:
super(MyButton, self).mousePressEvent(event)
def right_button_clicked():
print('right button clicked')
def left_button_clicked():
print('Left Button Clicked!!!!')
button = MyButton('TestButton', maya_window)
button.setWindowFlags(QtCore.Qt.Window)
button.clicked.connect(left_button_clicked)
button.rightButtonClicked.connect(right_button_clicked)
button.show()
ジョイント分割スクリプト
続いて紹介されたのは、ジョイント作成時の試行錯誤を助けるジョイント分割スクリプトである。QtのQSliderクラスに備わっている、スライダー調整中に発行される‟sliderPressed”‟sliderMoved”‟sliderReleased”といったシグナルにそれぞれ関数をコネクトする。開始・終了時の関数内でMayaのundoInfoを使ってopenChunk/closeChunkして操作をひとまとめにし、スライダー操作中の関数では、ジョイントの分割・分割をすでに行なっている場合には削除する処理を実装する。さらに、操作中はジョイントの色を変えておき、操作終了時には色を戻すところまでundoinfoに含めると、よりインタラクティブ性が高まり親切な設計となることが語られた。
from PySide2 import QtWidgets, QtGui, QtCore
from maya import OpenMayaUI, cmds
import shiboken2
maya_window = shiboken2.wrapInstance(
int(OpenMayaUI.MQtUtil.mainWindow()), QtWidgets.QMainWindow
)
class MySlider(QtWidgets.QSlider):
def __init__(self, parent=None):
super(MySlider, self).__init__(parent)
self.created_objects = []
self.sliderPressed.connect(self.start_to_drag)
self.sliderMoved.connect(self.dragging)
self.sliderReleased.connect(self.end_dragging)
def start_to_drag(self):
print('strat to drag!')
cmds.undoInfo(openChunk=True)
def dragging(self, value):
print('dragging value : {}'.format(value))
if self.created_objects:
cmds.delete(self.created_objects)
self.created_objects = []
for i in range(0, value):
cube = cmds.polyCube()
cmds.setAttr(cube[0]+'.ty', i * 1.5)
self.created_objects.append(cube[0])
def end_dragging(self):
print('Dragging was finished.')
cmds.undoInfo(closeChunk=True)
slider = MySlider(maya_window)
slider.setRange(1, 10)
slider.setWindowFlags(QtCore.Qt.Window)
slider.show()
Qtの描画機能の活用
最後に紹介されたのは、Qtの描画機能の活用事例だ。
「XYZの指定というのは直感的にはやりづらいんですが、このしくみで“ドラッグした方向のものが消える”という、ユーザーに分かりやすいUIが提供できます。画面に対して操作するようにしてあげると、作業速度の向上が実現できるんじゃないかなと考えました」(小森氏)
Qtのペイントイベントでは開始と終了の座標が取得できるため、ベクトルを確定できる。さらにMayaのアクティブビューを取得することで現在ワールド空間でどちらを見ているかを確定させ、両者を組み合わせて削除する側を決定する、というアイデアだ。
また、ジョイントチェーンを親子付けするツールでこの描画機能を応用し、親子付けの向きをドラッグで指定するというアイデアや、ビューポート上でラインを引くと、それに沿ってジョイントチェーンが曲げられるようにする応用アイデアも披露された。
「Qtを使うとこうやっていろいろと夢の広がるような機能が作れますよ、というところで、皆さんのアイデアの足しになったら幸いです」(小森氏)
格闘ゲームモデラーから見た ボーン配置 ミスりやすいところ3選
本村・C・純也氏
アークシステムワークス テクニカルアーティスト
アークシステムワークスにて格闘ゲームのセルルック3Dキャラクター作成全般に従事。リードモデラー、テクニカルアーティスト、ディレクターとして、キャラモデル、リギング、シェーダー作成など幅広く対応。代表作は『ギルティギア Xrd』シリーズ、『ドラゴンボール ファイターズ』、『DNFDuel』など。
www.arcsystemworks.jp
格闘ゲームの制作においては、誇張されたキャラクターデザインで激しいポーズが取れるモデル、リグが求められる。リギングの第一歩であるボーン配置は、シンプルでありながらも「ミスると後から効いてくる時限爆弾」になりかねない重要な工程である。今回は、本村氏がディレクションを重ねる中で得られた3点の知見が披露された。
ミスりやすいその①: 足の付け根!低すぎない?
まずは失敗例の多い、足の付け根の位置に注目。立ちポーズでは問題がなくても、取るポーズによっては問題が現れるという。
足の付け根のボーンの位置が低すぎると、大きく足を開いた際に足が短く見えてしまう椅子に座らせるとお尻が浮いてしまい、しっかり接地させると太ももが大幅に椅子にメリ込むような結果になってしまう。
「回転軸の位置が低いと、その分足が開く時の移動量が減ってしまうので、結果的に足が短く見えてしまうということが発生しがちです」(本村氏)
正しくボーンを配置するための考え方として、変形結果から逆算する手法が紹介された。変形結果を想定しておいて、そこから変形前・後2つのポーズが両立する位置にボーンを打つという方法だ。足を大きく振り上げてキックをするキャラクターでは、足を180度開脚した際の想定ラインと、真下におろした際の想定ラインが交差する位置にボーンを打てば、どちらのポーズも違和感なく両立させることができる。
「なんとなく腰と言えばこの辺だよねっていう思い込みみたいなもので配置してしまうと、後々から問題が発生して困ることになるので気をつけましょう」(本村氏)
ミスりやすいその②:足首の位置、高すぎない?
続いては、足首のボーン配置についての考え方が解説された。つい足首の一番細いところにボーンを打ちそうになるが、これでは回転する位置としてはかなり高いという。
「この回転軸が高い位置にあると、足から地面に伝わる力が足の裏を通らずに空振りしてしまい、結果的に足首に大きく負担がかかってしまいます。ヒールが高すぎる靴は運動に向かないのと同じ理由ですね」(本村氏)
ボーンの修正位置の目印として、くるぶしが挙げられる。くるぶしは脛(すね)の骨の一番下に位置しており、これより上が回転してしまうと、脛の途中が回転する現象が発生してしまう。つま先を伸ばしたポーズで脛から足の甲まで綺麗なラインをつくれているかどうかで、骨の位置の正しさをチェックできる。
ミスりやすいその③:背骨の位置、後ろすぎない?
胴体のボーンの位置には決まった正解がなく、用途に応じて異なる場所に配置する必要があるという。背骨だからと背中側に配置すると、身体を大きく捻った際にボーンから遠い腹部の変形が過大になってしまい、前屈・背屈のポーズでも不安定な形状変形となる。ボーンを胴体中心寄りに配置すると、実際の人体における背骨の位置とは乖離するものの、ポーズをとった際の形状が安定する。
「解剖学的な正しさを求めた場合、脊椎1本1本から筋肉、肌、脂肪、内臓までシミュレーションして体の体積を保つというようなことをしないといけません。さすがにCGでそれを完璧にやるのは難しいので、モーション都合で近似を取るということもあります」(本村氏)
立ちポーズでは問題ないからとチェックを通してしまうと、モーション工程に入ってから問題点が発覚し、リグでなんとかすることが難しくなるかもしれない。解剖学的な正しさにこだわりすぎず、くるぶしなどの身体のランドマークを基準に目安を覚えていくのが望ましいだろうと本村氏は語った。
「いろんなポーズでチェックして、どんなポーズにも対応できるようにつくっていくと、安心してアニメーターの方に渡してアニメーション作業に進めることができるようになります」(本村氏)
Bifrostで行うツール開発プロトタイピング
赤木達也氏
ゲームフリーク 研究開発部 CGテクノロジーラボ リグチームリーダー
映像業界でリガーとして多数の映像制作に関わる。2023年よりゲームフリークに入社。リグ、アニメーションツールの開発を担当。
www.gamefreak.co.jp
Bifrost(またはBifröst)はMaya2015にて登場したプラグインで、オートデスクが2012年に買収したExotic Matter社の流体シミュレーションツール・Naiadを前身としている。2019年にはBifrost2.0へとメジャーアップデートされ、Mayaに限らないスタンドアローンツールとなった。流体シミュレーションにとどまらないプロシージャルなビジュアルプログラミング環境として発展を重ねている。
赤木氏は映像業界で約20年のキャリアを積み、昨年からゲーム業界へ移籍。Bifrostについては登場から年数が経っているものの実制作現場ではまだ新しいツールであり、オブジェクトの追従やコリジョンとの接触判定などリグにも有用な機能が追加されるにつれて注目するにいたったという。
Bifrost使用のモチベーションについて、赤木氏はツール作成時の"結果のビジュアライズ"にあると語った。今回のライトニングトークでは、ポイントコンストレイン風の機能、および先端に追従するスプライン機能を例に、"結果のビジュアライズ"に関わる3つの要素‟Watchpoint (監視ポイント)”‟Terminal”‟Scope”が紹介された。
Watchpoint
Watchpointは、ノードグラフの各コネクションが現在どういった値になっているかを確認することができる機能だ。マトリックスやトランスレートなどコネクションの内容に合わせた情報が表示されることから、ツール開発時に有用であることが語られた。
Terminal
Terminalは‟評価シェイプ”を表示する機能である。実際にシーン内にポリゴンオブジェクトを作成するのではなく、パラメーターの値を視覚化するためのシェイプを生成する。
「つくったものが現在どういった状況になっているのかが視覚的にわかるので、こちらもツール開発時にはとても便利です」(赤木氏)
Scope
Scopeは、scalar_field_scope、vector_field_scope、location_scopeなど複数の種類が用意されており、それぞれに応じた情報を視覚化してくれる。ここでは追従する各シェイプからコリジョン平面への下向きのベクトルを矢印で表示。この際、get_closest_locationsを用いてコリジョン上の最近接点を求めている。
最近接点をプロシージャル的に求めているため、コリジョンを変形させても随時ベクトルが視覚化される。実は今回の例においては、面の切り替わりで不連続的な動きになってしまう問題が発生したそうだが、このような問題もScopeによって発生状況を視覚化することで、解決にいたったという。
赤木氏は最後に、Bifrostを学んできた方法を紹介した。Marco D' Ambros氏のチュートリアルを参考に、紹介されている作業をなぞってひとつひとつやってみるところから始めたとのこと。作業を行う際には、適宜変更を加えてみることでしくみを深く学ぶことができるという。
そのほか、Autodesk AREA JapanやプラチナゲームズのBifrost Blogなどもおすすめの学習ツールとして紹介された。
「他のプロシージャルソフトのチュートリアルの内容を応用してみるのも、ひとつの手段だと思います」(赤木氏)
3ds Maxでのモディファイヤを活用したリグTips
山本拓巳氏
MAPPA 3DCGモデラー
2019年、MAPPAにモデラーとして入社。モデリングを担当のほか、リガーとしても活動中。主な参加作品は『「進撃の巨人」 The Final Season』、『ドロヘドロ』など。
www.mappa.co.jp
山本氏のライトニングトークでは、メインツールである3ds Maxにおけるモディファイヤを使った特殊なリグが題材となった。解説にあたり使用されたアセットは髪の一房で、先端部に色ちがいの箇所があるのが特徴的だ。
今回紹介されたのは、毛先の色が異なる部分を調整するためのリグ‟裾カラーリグ”だ。模様がある状態でなびかせられるようなしくみの構築に、工夫が凝らされている。
キャラクターの特徴的な部分は画に与える影響が大きい。原則全て動かせるようにするために、対応するリグを構築することが多いという。髪の模様は本来動かないものだが、髪本体と同じように調整できるようにするために裾カラーリグが考案された。裾カラーリグの構造はシンプルで、UVWマップモディファイヤを用いてテクスチャを投影、ギズモによって投影箇所を調整できるため、それをコントローラと接続したというものだ。
つくり方としては、モデルにUVWマップモディファイヤを適用(ギズモ形状はモデルに合わせて適宜選択)し、エクスポーズトランスフォームヘルパーを作成する。エクスポーズトランスフォームヘルパーは、指定したノードを参照して各種トランスフォーム情報を出力してくれるヘルパーだ。
「非常に便利で、3ds Maxでリグを組むうえでは必要不可欠ですね」(山本氏)
続いて、ヘルパーの‟エクスポーズするノード”欄にUVWマップを調整するためのコントローラを設定し、パラメータワイアリングウィンドウにてヘルパーから出力されるローカル情報とUVWマップのローカル情報を接続。これでUVWマップのギズモを、任意のコントローラで操作できるようになる。
題材となった髪のアセットでは、同様のしくみで影の範囲も調整できるようになっているという。調整には工夫が必要だが、調整次第ではねらった影を出力することも可能になる。
なおこのしくみは汎用性が高く、例えば髪の毛の円形のハイライトや瞳の表現への応用も考えられる。
「テクスチャであれば複数のパターンも作成しやすく、かつコントローラーで制御することもできるため、カットごとに対応できる範囲も広がるのではないかと考えています」(山本氏)
リグとアニメーションのフレームワーク「eST3」紹介
金子悠司氏
ポリゴン・ピクチュアズ リググループリーダー
ポリゴンピクチュアズにてリガーとして映像制作に従事。2022年よりリググループをリーダーとして統括。
www.ppi.co.jp
ポリゴンピクチュアズ(以下、PPI)は、リグ・アニメーション・プラットフォーム「eST3」を5月24日にパブリックリリースした。「eST(enhanced STandards)」は、同社で長く活用されてきたMaya用ツールセットである。
代表的なツールのひとつに、ユニットと呼ばれる身体の部位ごとのテンプレートが挙げられる。ユニットを自由に組み合わせて人型やクリーチャーなどの概形を構成しておくことで、そこから骨やコントローラを簡易生成することができる。基礎となる骨組み/アニメーターが使うコントローラ/リガーがスキニングに使うジョイントの3点セットがユニットに含まれており、組み合わせて配置し位置合わせを行っておけば、コントローラとバインド用のスケルトンを素早く作成できる。
フローとしては、eSTをインストールするとビューポート上部に追加される専用メニューから、リグコンストラクターを呼び出して作業を開始する。
まずは基礎となる骨、ベーススケルトンを作成する。ここでは鳥脚などの脚の構造や、指を使うかどうかなどをカスタマイズできる。その後コントローラの作成でIKの仕様や腰の起点といったアニメーターからのニーズを反映した設定を行い、‟作成”を実行することでコントローラ類一式が構築される。この時点で、ピッカーなどユニットに設定してあるアニメーション作業用のUIが利用可能になっており、ポーズのスワップなども可能になっている。
続いてバインド用の骨を作成していく。ここで最初に生成した骨はその後のユニットのプラットフォームとなるため、なるべくシンプルに保つのが好ましい。バインド用の骨は多様な要望を受けて複雑化しがちであるため別枠のジョイントチェーンとして作成する。
ここからさらにユニットを追加していくこともできる。極端な例として、尻尾を足した上でその尻尾の途中に獣足を追加することも可能とのことで、ユーザーの使いたい組み合わせを直感的につくっていくことができる。
eSTを用いたリギング作業では、ユニット単位で作業を切り分けて分担することも可能になる。一度組み上げた上での任意の切り分けや再構築も手軽に行える。例えば頭と顔、髪、ボディをそれぞれ別の担当者がリギングし、最終的にそれらを組み合わせて完成させるといったフローを実現できる。
「急いでリギングしなければならないときは特に、こうした使い勝手の良さに助けられています」(金子氏)
アニメーションピッカーはコントローラ選択以外にも、IK/FK切り替えやミラーコピー、さらにアニメーション担当者が自分用のコントローラを簡易に追加することもできる。さらに、ポーズを登録してライブラリ化するといったサポートツールも充実している。
eST3については、2024年5月24日(火)に開催された eST3リリース交流会でさらに詳しく機能解説された。交流会の様子についても、後日CGWORLD.jpにてレポートを予定している。
背骨や尻尾のTwistコントローラのしくみ
福本健太郎氏
リブゼント・イノベーションズ BACKBONE事業部 リグコンサルタント
2002年に株式会社デジタル・フロンティアに入社。アニメーター、セットアップグループリーダーとして活動し、2007年に株式会社ポリゴン・ピクチュアズに移籍。アニメーションの経験を生かした「アニメーター目線のリグ」、「軽いリグ」、「量産・効率化リグシステム」の開発を得意とし、ゲーム、映画、TVシリーズなどの長編案件でリギングスーパーバイザーを担当。2012年にアセット部部長に就任しリギング、モデリング、エンバイロメントの3グループを統括。2017年、リグに特化したBACKBONEスタジオを設立。
【主な参加作品】
鉄拳8(2024)
映画『THE FIRST SLAM DUNK』 (2023)
映画『ドラゴンボール超 スーパーヒーロー』 (2022)
『シン・ウルトラマン』 (2022)
『シン・エヴァンゲリオン劇場版』 (2021)
『FINAL FANTASY VII REMAKE』 (2020)
『モンストアニメ 消えゆく宇宙編』(2017)など
「ローカルセットアップセミナー」
「Mayaパーフェクトスキニングウェビナー~美術解剖学に基づくロジカルスキニング講座~」
『ハリウッド×日本』クリーチャーアニメーション自主制作メイキング」
backbone-studio.com
x.com/kentaLOW12345
リグナイトの主催者である福本氏からは、『センザンコウ✕サーベルタイガー』に登場するクリーチャーの尻尾のリグについて、任意の箇所でひねり回転の制御ができるTwistコントローラのしくみが解説された。
Personal Animation project!!
— たつ Tatsu クリーチャーアニメーター 島田竜幸 (@tatsuyuki14) May 8, 2023
怪物の喧嘩!
森田さん @YuukiM0rita のセンザンコウ×サーベルタイガーmodelを
福本さん@kentaLOW12345 にrig組んでいただいて魂吹き込みました!
お二人共どうもありがとうございます!
ゴリゴリ動かすの楽しかった!!#エイド講座クリーチャー https://t.co/VC7pzjgUyZ pic.twitter.com/ul36YM3xYV
操作は主にSplineIK制御によるIKコントローラで行い、そこにFKコントローラが追従するしくみとなっている。
IKコントローラでは任意の箇所でツイストを行えるしくみだ。なお、背骨も尻尾と似た構造だが、より複雑なしくみになっているという。
「先端だけ、真ん中だけ、など任意の箇所をツイストできます。例えば"馬の手綱を手で持っていて、その手綱のところで回転制御したい"といった場面で活用できるリグになっております」(福本氏)
構成は4つの要素に分けられる。まずバインドのためのジョイントチェーンとバインドされたジオメトリ。この骨に向けて、アニメーターが操作するSplineIK骨 → Twist骨 → FKコントローラ骨の順で情報がながれ込む。それぞれの骨は、バインド時の骨を複製した同じ数・同じ軸のジョイントチェーンだ。
‟SplineIK”骨では、SplineIKを適用して作成されたカーブの両端・中央に骨を配置し、カーブをバインド、この骨をコントローラ制御している。
SplineIKにはツイストやロールアトリビュートが備わっており、ジョイントを捻ることができる。しかし、任意の場所で回転させるしくみはこれらでは実現できないため、今回は使用されていない。
回転のしくみづくりのため、ジョイントチェーン(図中の青)が用意された。まず、ツイストではなくSplineIK制御の結果を青いジョイントチェーンに伝える。ここではオリエントコンストレインが用いられた。コネクトでは回転させたジョイント以下の子階層も回転してしまうが、コンストレインであればワールドで固定され、子階層の骨は影響を受けない。
オリエントコンストレインにはOffsetX,Y,Zというアトリビュートが備わっており、ローテーションがコンストレインされた状態でさらに回転制御するために使うことができる。
両端はそれぞれコントローラのツイストに対して100%回転させたいのでコネクションで接続する一方、それらの間の骨は50%の影響で回転してほしいため、Pair Blendノードを活用。SplineIKのジョイントからの回転を入力し、オリエントコンストレインノードのOffsetXへ出力、ウェイトを0.5にすることで半回転させる。なお、回転補完メソッドは‟Quaternion”に切り替えておく。
FKコントローラは、骨とコントローラを交互に階層化したものだ。骨は見える必要がないので、ドロースタイルをNoneにして不可視化された。この階層構造のそれぞれの骨を先ほどのツイスト骨で駆動させるのだが、ここではコンストレインではなくコネクトが用いられた。仮にここでもオリエントコンストレインを使った場合、FK回転させた時に子階層は回転しない。
「どちらが好ましいかは用途によるので使い分けますが、FK回転で子階層も沿うのが一般的かとは思います。そのため、今回はコンストレインではなくコネクトで繋げています」(福本氏)
バインド骨が直接操作される可能性がないことをふまえ、FK骨からバインド骨への最終的な接続では、再びオリエントコンストレインが使用された。
「複雑に見えても、ひとつひとつ要素はシンプルに組まれていて、それが組み合わさって複雑に見えているだけ、という状態がリグにおいては望ましいと思っています。最初から複雑にしてしまうと、スケールが入ってきた場合やカスタマイズしたい場合に対応できなくなるんですね。シンプルかつロジカルに設計していくということが非常に重要だと考えています」(福本氏)
各機能の特性や、行われている計算を正しく把握せずに使うと、やはり複雑化を招いてしまう。どういうしくみで動いているのかをしっかりと理解することで、一見同じようなリグに見えても全く異なる方法で組むことも可能だと福本氏は語る。
「引き出しが多いといろんなアイデアを組み合わせることができます。このアイデアを組み合わせる工程が、リグの醍醐味かなと思います。最初は引き出しが少なくても、いろいろなリグを見てバターンを引き出しにストックして、そこからロジカルに自分のアイデアを組み込みながら組んでいくと、よりリグが楽しくなると思います」(福本氏)
TEXT_ks
EDIT_Mana Okubo(CGWORLD)
PHOTO_弘田 充/Mitsuru Hirota