Appearance
発展資料 座標空間と行列
授業一覧: シェーダー基礎 / 関連資料: ボーン階層とスキニング変換
この資料で扱う内容
- Object、World、View、Clip、Screenの各座標空間を区別する
- Transformと4x4行列、同次座標の関係を理解する
- Model、View、Projectionによる変換の流れを追う
- 位置と方向の変換方法を比較する
- Shader Graphの
PositionノードとTransformノードを使う - 計算前に座標空間をそろえ、結果の違いを確認する
座標空間の基礎
位置や方向を表す基準

1つの頂点は、Object Space から World Space、View Space、Clip Space へ順に変換され、最終的に画面上の位置へ対応づけられます
- 座標空間とは、位置や方向を数値で表すための基準です
- 同じ点でも、モデル自身、シーン全体、カメラのどれを基準にするかによって座標値は変わります
- 座標値が異なっていても、基準となる空間が違うだけで、同じ場所を表している場合があります
- 座標変換とは、点や方向が表す内容を保ったまま、別の座標空間の値へ置き換える処理です
教室と校舎で異なる位置の基準
同じ場所でも、どこを基準にするかによって位置の表し方は変わります
例えば、教室内にある机の位置を、教室の入口を基準にして次のように表せます
- 入口から右へ 2m
- 入口から奥へ 3m
同じ机を校舎の玄関から見れば、別の値で表されます
- 玄関から東へ 20m
- 玄関から北へ 15m
どちらも同じ机の位置を示していますが、基準となる原点と軸の向きが異なるため、位置を表す数値も異なります
3D CG でも、同じ点をモデル自身を基準に表すか、シーン全体を基準に表すかによって座標値が変わります
オブジェクトや親を基準にするローカル空間
Local Space は、オブジェクト自身または親オブジェクトを基準にした座標空間の総称です
Unity の Transform では、子オブジェクトのローカル座標は親 Transform を基準にします
一方、メッシュの頂点やシェーダーについて考える場合は、モデル自身の原点と軸を基準にします
この空間はObject Spaceと呼ばれます
例えば、立方体の頂点が Object Space で (0.5, 0.5, 0.5) にあるとします
立方体をシーン内の別の場所へ移動しても、形状が変わらない限り、この頂点の Object Space 座標は変わりません
Object Space で表しているのは、シーン内の配置ではなく、モデル内部での位置 です
Object Space は、主に次のような処理で使われます
- モデルの頂点位置を扱う
- オブジェクト自身の向きを基準に移動する
- 親から見た子オブジェクトの位置を表す
- オブジェクトに固定された模様や変形を作る
シーン全体を基準にするワールド空間
World Spaceは、シーン全体で共有される原点と軸を基準にした座標空間です
オブジェクトや頂点が、シーン内のどこにあるかを表します
例えば、立方体をワールド座標 (10, 0, 5) に配置すると、各頂点のワールド座標には立方体の移動、回転、スケールが反映されます
立方体を移動しても頂点の Object Space 座標は変わりませんが、World Space 座標は変化します
World Space で表しているのは、シーン全体から見た位置 です
World Space は、主に次のような処理で使われます
- シーン内でのオブジェクトの位置を扱う
- オブジェクト同士の位置関係を調べる
- ライトやカメラとの距離を求める
- 地面からの高さを調べる
- ワールドに固定された方向や模様を扱う
ローカル空間とワールド空間の違い
ローカル座標とワールド座標は、必ずしも別の場所を表しているわけではありません
同じ点を、異なる基準から表した値です
立方体のある頂点について考えます
(ここでは説明を単純にするため、立方体には回転と拡大縮小がないものとします)
text
頂点の Object Space 座標
(0.5, 0.5, 0.5)
立方体の World Space での位置
(10, 0, 5)
頂点の World Space 座標
(10.5, 0.5, 5.5)立方体をワールド座標 (20, 0, 5) へ移動すると、頂点の座標は次のようになります
text
頂点の Object Space 座標
(0.5, 0.5, 0.5) // モデル内部の位置なので変わらない
頂点の World Space 座標
(20.5, 0.5, 5.5) // オブジェクトの移動に合わせて変わる違いを整理すると、次のようになります
| 観点 | Local / Object Space | World Space |
|---|---|---|
| 基準 | オブジェクト自身または親 | シーン全体 |
| 原点 | オブジェクトまたは親の原点 | ワールド原点 |
| 軸の向き | オブジェクトまたは親の向き | シーン共通の向き |
| オブジェクトを移動した場合 | モデル内部の座標は変わらない | シーン内での座標が変わる |
| 主な用途 | モデル内部の処理、親子関係 | オブジェクト同士の位置関係 |
Object Space から World Space への変換には、オブジェクトの位置、回転、スケールが使われます
この変換を Object to World 変換と呼びます
Object Spaceの座標
Object to World変換
World Spaceの座標
反対に、World Space の座標をオブジェクト基準へ戻す場合は、World to Object 変換を使います
Unityで使う座標空間
Transformと座標空間の関係
Unity では、Transform のプロパティによって座標の基準が異なります
transform.positionは World Space での位置transform.localPositionは親 Transform を基準にした位置- Inspector の Position は、親がある場合は親を基準にしたローカル座標
親がない GameObject では、position と localPosition が同じ値になる場合があります
ただし、親が移動、回転、拡大縮小されると、子の localPosition が変わらなくても position は変化します
これは、子のローカル座標に親の Transform が適用され、最終的なワールド座標が求められるためです
カメラを基準にするビュー空間
View Spaceは、カメラの位置と向きを基準にした座標空間です- カメラが原点にあり、カメラの向きに合わせて座標軸がそろっているものとして位置や方向を表します
- カメラが動くと、同じワールド位置にある点でも View Space の座標値は変化します
- カメラから見た位置、奥行き、視線方向などを扱う処理で使用します
- カメラ距離によるフェードや、画面に対する向きを使った表現にも利用できます
3Dの点を画面へ対応づけるクリップ空間とスクリーン空間
Clip Spaceは、View Space の座標に Projection Matrix を適用した直後の座標空間です- カメラの視野角、Near、Far、アスペクト比などが反映されています
- Clip Space の座標を
wで割ると、画面への投影に使われる正規化された座標になります - その座標を画面の幅と高さへ対応づけたものがScreen Spaceです
- ポストエフェクトや画面座標を使うノイズ、歪みなどでは Screen Space を使用します
主な座標空間を用途で使い分ける
| 空間 | 基準 | 主な用途 |
|---|---|---|
| Object / Local | モデル自身または親 | 頂点変形、オブジェクトに固定された模様 |
| World | シーン全体 | ライト位置、空間ノイズ、高さによる表現 |
| View | カメラ | カメラから見た位置、奥行き、視線に依存する表現 |
| Clip | 投影後の座標 | 描画パイプライン内部、表示範囲の判定 |
| Screen | 画面 | ポストエフェクト、画面座標による表現 |
Shader Graph には、扱う座標空間を Space で選択できるノードがあります
例えば Position、Normal Vector、View Direction などでは、必要な空間を指定して値を取得できます
Transformと行列
位置、回転、スケールをまとめるTransform
Transform は、オブジェクトの位置、向き、大きさを決める情報です
- Unity の GameObject は必ず
Transformを持っています - Transform は、位置
Position、回転Rotation、スケールScaleをまとめて扱います - 親子関係がある場合は、子の Transform に親の Transform が重ねて適用されます
- メッシュの頂点に Transform の変換を適用すると、World Space での位置、向き、大きさが決まります
- これらの変換は、描画処理では主に行列として扱われます
数値を構造として扱うスカラー、ベクトル、マトリクス、テンソル

シェーダーでは、1つの数値だけでなく、複数の数値をまとめたデータを頻繁に扱います
| 種類 | 形 | シェーダーやCGでの例 |
|---|---|---|
| Scalar | 1つの数値 | 時間、透明度、明るさ、しきい値 |
| Vector | 数値の並び | 位置、方向、色、UV |
| Matrix | 行と列に並んだ数値 | 座標変換、回転、スケール、投影 |
| Tensor | さらに多くの軸を持つ数値の集合 | 画像、ボリューム、機械学習で扱うデータ |
- スカラーは、強度や時間などを表す単一の数値です
- ベクトルは、位置、方向、色などを複数の成分で表します
- マトリクスは、数値を行と列に並べたもので、座標変換などに使われます
- テンソルは、スカラー、ベクトル、行列を含む、より一般的な多次元データの考え方です
- この授業では主に、ベクトルを行列で変換する処理 を扱います
複数の変換をまとめる行列
- 行列(Matrix)は、数値を行と列に並べたものです
- 3D CG では、回転、スケール、移動、投影などの変換を行列で表します
- 頂点座標に変換行列を適用すると、別の座標空間での座標を求められます
- 行列同士を掛け合わせると、複数の変換を1つの行列へまとめられます
- 例えば、モデルの変換、カメラの変換、投影の変換を連結し、頂点を一度に Clip Space まで変換できます
3D CGの座標変換で使う4x4行列
text
[ m00 m01 m02 m03 ]
[ m10 m11 m12 m13 ]
[ m20 m21 m22 m23 ]
[ m30 m31 m32 m33 ]数式では、次のように表せます
- 3D の位置は、通常
(x, y, z)の3成分で表します - ただし、回転、スケール、移動、投影を同じ形式で扱うため、3D CG では 4x4 行列をよく使います
- 4x4 行列で変換する座標は、
(x, y, z, w)の4成分で表します - このように成分を1つ追加して座標を表す方法を、同次座標と呼びます
同次座標系
4成分の比として位置を表す方法
同次座標では、3D の点を4成分の比として表します
- 通常の3D座標は
(x, y, z)の3成分で点を表します - 同次座標では、同じ点を
(X, Y, Z, W)の4成分で表します Wが0でない場合、通常の3D座標には次の式で戻せます
(1, 2, 3, 1)と(2, 4, 6, 2)は異なる4成分の値ですが、Wで割るとどちらも(1, 2, 3)を表します- 3D CG では、点を
(x, y, z, 1)、方向を(x, y, z, 0)として扱うのが基本です
なぜ1つ多い成分が必要なのか
3x3 行列では、回転や拡大縮小など、原点を固定した変換を表せます
しかし、平行移動では原点そのものを別の位置へ移すため、3x3 行列による乗算だけでは同じ形式で表せません
そこで、3D 座標に w 成分を加え、4x4 行列を使います
4列目に移動量を持たせることで、回転、スケール、平行移動を1回の行列乗算として扱えるようになります
text
3x3 Matrix * 3D Vector = 3D Vector // 回転やスケールを表せる
4x4 Matrix * 4D Vector = 4D Vector // 移動や投影も同じ形式で扱える- 同次座標を使うと、回転、スケール、移動、投影を行列として統一できます
- 複数の行列を掛け合わせれば、複数段階の変換を1つにまとめられます
- この仕組みにより、
Model、View、Projectionの各変換を連結できます
w の値で移動の影響が変わる
| 値 | 意味 | 変換時の挙動 |
|---|---|---|
(x, y, z, 1) | 点、位置 | 平行移動の影響を受ける |
(x, y, z, 0) | 方向 | 平行移動の影響を受けない |
- 点は空間内の場所を表すため、オブジェクトを移動すると一緒に移動します
- 方向は向きだけを表すため、オブジェクトを移動しても変化しません
- ライト方向や視線方向は、方向ベクトルとして扱います
- 法線も位置ではなく方向として扱いますが、非一様スケールを含む場合は専用の法線変換が必要です
- 位置と方向を同じ方法で変換すると、ライティングなどの結果が不正になります
行列による座標変換
掛ける順番で結果が変わる
同じ移動と回転でも、適用する順番が変わると最終的な位置は変わります
- 行列の掛け算には交換法則が成り立たないため、順番を入れ替えると別の変換になります
- 「回転してから移動」と「移動してから回転」では、同じ値を使っても結果が異なります
- Unity の Transform 階層でも、親と子の変換が適用される順番が重要です
- スキンメッシュで関節の位置や階層が重要になるのも、変換が順に重ねられるためです
Model Matrix
Model Matrixは、モデルの Object Space 座標を World Space 座標へ変換する行列です- Unity では、主に Object to World の変換として扱われます
- 頂点位置に Model Matrix を適用すると、シーン内での位置が求められます
- GameObject の Position、Rotation、Scale を変更すると、対応する Model Matrix も変化します
View Matrix
View Matrixは、World Space 座標をカメラ基準の View Space 座標へ変換する行列です- View Matrix は、概念的にはカメラの Transform と逆向きの変換です
- カメラを右へ動かすことは、カメラから見れば世界全体を左へ動かすことに相当します
- View Space に変換すると、カメラから見た位置や奥行きを扱いやすくなります
- 第08回の
View Directionや、第09回で扱ったライト空間の考え方にもつながります
Projection Matrix
Projection Matrixは、カメラから見た3D空間を画面へ投影するための行列です- 透視投影では、遠くのものほど小さく見える効果を作ります
- カメラの Field of View、Near、Far、アスペクト比などが Projection Matrix に反映されます
- 変換結果は Clip Space の座標となり、その後の透視除算によって画面上の位置へ対応づけられます
頂点を画面上の位置へ変換するMVP
Object Position
モデル変換を適用する
Model Matrix
Model Matrix
World Spaceへ移す
World Position
World Position
カメラ変換を適用する
View Matrix
View Matrix
View Spaceへ移す
View Position
View Position
投影変換を適用する
Projection Matrix
Projection Matrix
Clip Spaceへ移す
Clip Position
Clip Position
wで除算する
Perspective Divide
Perspective Divide
画面座標へ対応させる
Screen Position
MVPはModel、View、Projectionの頭文字です- 頂点シェーダーでは、最終的に頂点位置を Clip Space へ変換します
- Shader Graph では多くの処理を Unity が自動的に行いますが、内部では同様の変換が行われています
- HLSLを直接書く場合や、特殊な頂点変形を行う場合は、この流れを理解しておく必要があります
Shader Graphで座標空間を扱う
計算前に空間をそろえる
- 第07回では、法線とライト方向の内積から明るさを求めました
- 法線が Object Space、ライト方向が World Space のままでは、正しい角度を計算できません
- 第09回の Shadow Map でも、深度を比較するために現在の点をライト空間へ変換しました
- 位置の差や距離、方向同士の内積などを求める場合は、各値を同じ座標空間へそろえる必要があります
- 計算に使う値が、どの座標空間に属しているかを確認することが重要です
Positionノード
- Shader Graph の
Positionノードは、現在の点の位置を出力します SpaceをObjectにすると、モデル自身を基準にした位置になりますSpaceをWorldにすると、シーン全体を基準にした位置になりますSplitノードで X、Y、Z 成分に分けると、座標値を色やマスクの生成に利用できます- 値の範囲や繰り返し方を調整する場合は、
Multiply、Fraction、Saturateなどのノードを組み合わせます
Transformノード
Transformノードは、位置や方向を別の座標空間へ変換するためのノードです- 例えば、Object Space の値を World Space へ変換したり、World Space の値を View Space へ変換したりできます
- 変換する値が
Position、Direction、Normalのどれであるかによって、適用される処理が異なります Normal Vector、View Direction、Positionなどを組み合わせる場合は、各ノードの Space がそろっているか確認します
座標空間の不一致による問題
起こりやすい問題:
- オブジェクトを回転すると、ライトの当たり方が不自然に変化する
- カメラを動かすと、オブジェクトに固定したはずの模様がずれる
- ワールドに連続するノイズを作ったつもりが、オブジェクトごとに模様が分断される
- 法線と視線方向の Space が異なり、フレネルの出方が不自然になる
- 位置として変換すべき値を Direction として変換し、平行移動が反映されない
対策として、入力する値、計算途中の値、出力する値がどの空間にあるか を確認します
実習:座標空間の違いを見える形で確認する
Object Space と World Space の違いを Shader Graph で比較します
実習1:Object Spaceの座標から縞模様を作る
- Lit Shader Graph または Unlit Shader Graph を作成する
Positionノードを追加し、Space をObjectにするSplitノードで X、Y、Z を取り出す- X 成分を
Multiplyで拡大し、Fractionで繰り返す値にする - 値を色へ接続し、オブジェクトを移動しても縞模様がオブジェクトについてくることを確認する
実習2:World Spaceの座標から縞模様を作る
Positionノードの Space をWorldに変更する- 同じように X 成分から繰り返す値を作る
- オブジェクトを移動し、縞模様がワールド側に固定されて見えることを確認する
- 複数のオブジェクトへ同じマテリアルを適用し、模様がオブジェクトをまたいで連続するか確認する
- Object Space を使った場合との違いをスクリーンショットで比較する
実習3:Transformノードで座標空間を変換する
Positionノードの Space をObjectにするTransformノードで Object から World へ変換する- 変換後の X 成分を使って色を作る
- 最初から
Positionノードを World にした場合と同じ見た目になるか確認する PositionとDirectionの設定を切り替え、平行移動の影響がどのように変わるか観察する
実習4:View Spaceでカメラに依存する表現を作る
Positionノードを View Space に設定する、またはView Directionノードを使用する- カメラからの距離や向きに応じて色を変える
- カメラを移動し、見た目が変化することを確認する
- World Space の位置を使った表現と比較する
- 表現をオブジェクト、ワールド、カメラのどれに固定したいかを考える
授業内課題:Object SpaceとWorld Spaceを比較する
座標空間の選択によって見た目がどのように変わるかを示します
完成条件
- Shader Graph で
Positionノードを使用している - Object Space と World Space を使った見た目を比較している
- オブジェクトを移動、回転、スケールしたときの変化を確認している
Split、Multiply、Fraction、Saturate、Stepのいずれかを使って座標値を加工している- 使用した値がどの座標空間にあるかを説明できる
- スクリーンショットまたは短い動画で違いを確認できる
確認項目
- 座標から作った色や模様がオブジェクトに固定されているか
- 座標から作った色や模様がワールドに固定されているか
- オブジェクトを移動したとき、どの座標値が変化するか
- カメラを動かしたとき、見た目が変化する表現になっているか
- 法線、視線方向、ライト方向の Space がそろっているか
- Transform ノードの変換元、変換先、変換する値の種類を説明できるか
この資料の到達目標
- Object Space、World Space、View Space の違いを説明できる
- Unity のローカル座標と、シェーダーで扱う Object Space の関係を説明できる
- Transform が位置、回転、スケールをまとめたものであることを説明できる
- 行列が座標変換を表すために使われることを説明できる
- 位置と方向では、平行移動の扱いが異なることを説明できる
- Shader Graph で Object Space と World Space の違いを確認できる
まとめ
- 座標空間は、位置や方向を数値で表すための基準です
- Object Space はモデル自身、World Space はシーン全体、View Space はカメラを基準にします
- Transform の位置、回転、スケールは、描画処理では行列として座標へ適用されます
- Model、View、Projection の順に変換することで、頂点を画面上の位置へ投影できます
- 点と方向では、平行移動の影響が異なります
- シェーダーでは、計算に使う値の座標空間をそろえることが重要です
次回
次回はボーン階層の変換連鎖に触れ、頂点変形との比較演習を行います