モデルの表示に関連する座標系¶
3D モデルの配置に関連する座標系について説明します。
各種 3D モデルエディタでの座標系¶
各種 3D モデルエディタごとに、 \(x\) 軸、 \(y\) 軸、 \(z\) 軸の向いている方向は異なります。例として Blender では、通常下記のように正面が \(-y\) 軸方向となるようにモデルを作成します。 3D モデルエディタによっては、編集時の座標系とファイル出力時の座標系が異なる場合がありますので、ファイル出力時にどのような座標系で出力されるかを確認してください。

glTF 座標系¶
glTF の座標系は Y Up (\(y\) 軸が上方向)で出力されることが多く、 Mapray でもこの座標系で出力されていることを前提に処理を行います。
上記モデルの出力結果は、下図のように \(y\) 軸が高さ方向、 \(z\) 軸が正面となるような座標系で出力されます(正面である必要はありません)。
出力されるモデルの座標系の方向(特に \(y\) 軸方向が上であるかどうか)を確認してください。

Mapray での表示方向¶
下図は上記モデルを Mapray で読み込んだ結果です。 外側・内側の座標系が表示されていますが、外側に表示されている座標系が上記 glTF モデルの座標系です。 Heading, Tilt, Roll など、姿勢を制御するパラメータを指定しない場合、 3D モデルは図のような方向に配置されます。 \(y\) 軸が高さ方向、 \(z\) 軸が北方向、 \(x\) 軸が西方向を向いています(3D モデルの正面が北を向くことになります)。
Mapray では、内部的な計算を Mapray ローカル座標系で計算するため、 Mapray Cloud から glTF を読み込む際に座標系の方向が自動的に変換されるようになっています。 glTF ファイルでは上方向が \(y\) 軸となっていますが、読み込み後は上方向が \(z\) 軸、正面方向が \(y\) 軸方向となっています。

Mapray では、 3D モデルの方向を Mapray ローカル座標系(上図中の内側の座標系)で管理します。
3D モデルの座標変換¶
Mapray で表現される 3D モデルは、 Mapray ローカル座標系への変換行列 \(T_\mathrm{MLOCS}\) および、姿勢変換行列 \(T_\mathrm{attitude}\) が適用されます。 全体を通した変換行列 \(T_\mathrm{all}\) は下記のようになります。
モデルに含まれる点 \(\vec{p}_m\) と実際に表示される位置 \(\vec{p}_g\) の関係は下記のように計算されます。
Mapray ローカル座標系および姿勢変換¶
Mapray ローカル座標系 \(T_\mathrm{MLOCS}\) は下記のように定義されます。
- 地球上の任意の点 \(p_o\) を原点とする
- \(z\) 軸を上方向(地球中心と反対方向)
- \(y\) 軸を北方向(\(z\) 軸に垂直)
- 右手系で残りの軸を \(x\) 軸とする
コーディングについて、 mapray.ModelEntity.setPosition() を用いて \(p_o\) を指定すると、自動的に Mapray ローカル座標系が適用されるようになります。
姿勢変換 \(T_\mathrm{attitude}\) は、上記座標系へ配置された後で適用されます。 現在のバージョンでは Heading, Tilt, Roll でモデルの姿勢変換を行います。
下図は、 Mapray ローカル座標系、 Heading, Tilt, Roll で回転する方向を示します。 (比較のため glTF 座標系で回転する方向も示します)
| Maprayローカル座標系 | glTF座標系 | |
|---|---|---|
![]() |
![]() |
|
| Heading | \(+z\) 軸側から中心を見て時計回り | \(+y\) 軸側から中心を見て時計回り |
| Tilt | \(+x\) 軸側から中心を見て時計回り | \(+x\) 軸側から中心を見て反時計回り |
| Roll | \(+y\) 軸側から中心を見て時計回り | \(+z\) 軸側から中心を見て時計回り |
コーディングについて、 mapray.ModelEntity.setOrientation() を用いて姿勢情報を指定します。
姿勢情報は mapray.Orientation クラスを用いて表現します。
姿勢変換の行列計算¶
姿勢変換 \(T_\mathrm{attitude}\) の詳細な座標変換について説明します。
モデルに対し、下記の順番で演算を行います。

姿勢変換行列 \(T_\mathrm{att}\) は下記のようになります。
コーディングについて、mapray.ModelEntity.setOrientation() を用いて姿勢情報を指定すると、上記行列計算が行われるようになっています。

