3DCG制作において、キャラクターや建物を思い通りの場所に配置し、自然な動きを与えるためには「座標系」の理解が欠かせません。
座標系とは、3次元空間内での位置や向きを数値で定義するためのルールのことであり、制作工程のあらゆる場面で活用されています。
一見すると数学的で難しく感じられるかもしれませんが、その仕組みを把握することで、モデルの変形トラブルや配置のズレを防ぐことが可能になります。
本記事では、3DCGの基礎となるワールド座標やローカル座標の違いから、右手系・左手系の概念、そして描画までの流れを詳しく解説します。
3DCGにおける座標系の基礎知識
3DCGの世界は、縦・横・奥行きの3つの軸によって構成される仮想的な空間です。
この空間内で「どこにオブジェクトがあるか」を示すために、数学的な座標という概念が用いられます。
一般的に、横方向をX軸、縦方向をY軸、奥行き方向をZ軸として定義します。
すべての基準となる点は「原点」と呼ばれ、数値では(0, 0, 0)と表記されます。
3DCGソフトの種類によって、どの軸が上を向いているか(YアップかZアップか)といった仕様が異なる場合があります。
この仕様の違いを理解していないと、ソフト間でデータを移行した際にモデルが横倒しになってしまうといった問題が発生します。
座標系を正しく理解することは、効率的なワークフローを構築するための第一歩と言えるでしょう。
右手系と左手系の違い
3DCGの座標系には、大きく分けて「右手系」と「左手系」という2つの形式が存在します。
これらは、親指、人差し指、中指をそれぞれ直交させたときの軸の向きを基準に判別されます。
右手系(Right-handed System)
右手系では、右手の親指をX軸、人差し指をY軸、中指をZ軸に見立てたとき、中指が自分の方を向く形式です。
MayaやBlender、3ds Max、OpenGLなどの主要なDCCツールやグラフィックスライブラリで広く採用されています。
数学や物理学の分野で一般的に使われる形式であるため、技術的な計算との親和性が高いのが特徴です。
左手系(Left-handed System)
左手系では、左手の指を使って軸を定義し、中指が奥(画面の向こう側)を向く形式となります。
主にDirectXやUnity、Unreal Engineといったゲームエンジンで採用されることが多い傾向にあります。
奥行きが増えるほどZの値が大きくなるため、人間の直感に馴染みやすいというメリットがあります。
ソフトウェア別の採用状況
以下の表は、主要な3DCGツールやゲームエンジンにおける座標系の違いをまとめたものです。
| ソフトウェア・API | 座標系 | 上方向の軸(Up-axis) |
|---|---|---|
| Blender | 右手系 | Z軸 |
| Maya | 右手系 | Y軸(設定変更可) |
| Unity | 左手系 | Y軸 |
| Unreal Engine | 左手系 | Z軸 |
| 3ds Max | 右手系 | Z軸 |
ローカル座標(オブジェクト座標)とは
ローカル座標とは、各オブジェクト自身が持っている固有の座標系のことです。
「オブジェクト座標」や「モデル座標」とも呼ばれ、オブジェクトの中心(ピボット)を原点(0, 0, 0)として考えます。
例えば、キャラクターの頭の位置を定義する場合、足元を基準とした相対的な距離で表されるのがローカル座標です。
オブジェクトを回転させると、ローカル座標の軸も一緒に回転します。
そのため、「キャラクターの正面方向に進む」といった処理を記述する際には、ローカル座標が必要不可欠となります。
モデリング作業の多くはこのローカル空間で行われ、形状の対称性を保つのに役立ちます。
ワールド座標とは
ワールド座標とは、3Dシーン全体の絶対的な基準となる座標系のことです。
シーン内に存在するすべてのオブジェクトは、最終的にこのワールド座標の中のどこに位置するかによって管理されます。
個別のオブジェクトが持つローカル座標を、シーン全体の共通ルールに変換したものがワールド座標上の値です。
「太陽は常に真上(ワールド空間のY軸正の方向)にある」といった、シーン全体で共通の概念を扱う際に使用されます。
ワールド座標の原点は、その3D空間のまさに中心点であり、動くことはありません。
複数のオブジェクトを配置して一つの場面を作る場合、すべての位置関係はこのワールド座標によって決定されます。
親子関係と座標の継承
3DCGには「ペアレント(親子関係)」という仕組みがあり、これが座標の計算に大きく影響します。
あるオブジェクト(子)を別のオブジェクト(親)に紐付けると、子の座標は親からの相対的な位置として扱われます。
例えば、自動車のモデルを親とし、タイヤのモデルを子とした場合を考えてみましょう。
自動車がワールド空間を移動すると、タイヤもその動きに合わせて移動しますが、タイヤ自身のローカル座標値は変化しません。
このように、座標系は階層構造(ヒエラルキー)を持っており、親の座標系が子にとっての基準(ローカル空間)になるという性質があります。
この仕組みを利用することで、複雑なロボットの関節運動や、キャラクターの装備品の追従などを効率よく制御できます。
ビュー座標(カメラ座標)の役割
ワールド座標に配置された物体を、画面に映し出すために必要なのが「ビュー座標」です。
これは、カメラの視点を原点とし、カメラが向いている方向を基準とした座標系です。
私たちが映画やゲームで見ている映像は、すべてこのカメラからの視点に基づいて計算されています。
ワールド空間内のすべての物体は、レンダリングの過程で一度カメラから見た相対的な位置に変換されます。
この変換を行うことで、カメラに近い物体は大きく、遠い物体は小さく描画するための計算がスムーズになります。
視錐台(フラスタム)カリングと呼ばれる、カメラに映らない物体を計算から除外する処理も、このビュー座標系で行われます。
スクリーン座標と最終的な出力
3DCGの最終工程では、3次元のデータを2次元のディスプレイ画面に投影する必要があります。
この2次元平面上の座標系を「スクリーン座標」と呼びます。
スクリーン座標は、画面の左上または左下を原点とし、ピクセル単位で位置を表します。
3次元のZ軸の情報は、ここで「深度(デプス)」として扱われ、前後関係の判定に利用されます。
これまで解説してきた座標の変換プロセスは「グラフィックスパイプライン」と呼ばれ、以下のような流れで進みます。
- ローカル座標(モデリング時の数値)
- ワールド座標(シーン配置後の数値)
- ビュー座標(カメラから見た数値)
- クリップ座標(画面に収まる範囲の数値)
- スクリーン座標(実際のピクセル位置)
座標変換(行列計算)の仕組み
これらの座標系同士を変換するために使われるのが「行列(マトリックス)」という数学的ツールです。
3DCG内部では、移動、回転、拡大縮小といった情報を4×4の行列として保持しています。
例えば、ローカル座標の点に行列を掛け合わせることで、ワールド座標の点へと変換することが可能です。
プログラミング(シェーダー記述など)を行う際には、これらの行列計算が頻繁に登場します。
// 頂点シェーダーでの座標変換の例
// modelViewProjection行列を使用して、ローカル座標をクリップ座標へ変換する
float4 worldPosition = mul(modelMatrix, localPosition);
float4 viewPosition = mul(viewMatrix, worldPosition);
float4 clipPosition = mul(projectionMatrix, viewPosition);
// 実行結果(概念図)
// オブジェクトの各頂点が、画面上の正しいピクセル位置へと計算される
最近のゲームエンジンやDCCツールでは、これらの計算はバックグラウンドで自動的に行われるため、ユーザーが意識することは少なくなっています。
しかし、スクリプトで高度な制御を行う場合や、エフェクトを作成する際には、どの座標系で計算を行っているかを意識することが非常に重要です。
座標系でよくあるトラブルと対処法
3DCG制作において、座標系に関連するトラブルは頻繁に発生します。
最も多いのが、インポートしたモデルのサイズが極端に大きかったり、向きが異なっていたりするケースです。
これは、出力側のソフトと入力側のソフトで「1ユニット(単位)」の定義や「アップ軸」の設定が異なるために起こります。
例えば、Unityは1ユニットを1メートルとして扱いますが、他のソフトでは1センチメートルとして書き出されることがあります。
また、スケール(拡大率)が「1.0」以外の状態で親子関係を設定すると、子の変形が歪む原因になります。
これを防ぐためには、エクスポート前に「フリーズ(座標の初期化)」を行い、スケールを1、回転を0にリセットする習慣をつけることが大切です。
各ソフトウェアの書き出し設定(FBX設定など)で、軸の変換オプションを正しく指定することも忘れてはいけません。
まとめ
3DCGにおける座標系は、仮想空間内の秩序を保つための基礎となる極めて重要な概念です。
自身の作業環境が右手系なのか左手系なのか、そして今扱っている数値がワールド基準なのかローカル基準なのかを常に意識しましょう。
座標の仕組みを正しく理解することで、異なるソフト間でのデータ連携がスムーズになり、テクニカルなエラーにも柔軟に対応できるようになります。
最初は複雑に感じるかもしれませんが、座標系の変換ルールをマスターすることは、より高度な3DCG表現への近道となるはずです。
今後の制作活動において、位置や回転の数値に迷ったときは、この記事で紹介した座標系の階層構造を思い出してみてください。
