【Godot 4.0】スマホ３Dゲームを作るための勉強　その２　3D空間と操作

 ゲームエンジンgodot4.0で3Dスマホゲームを作りたいと思いますが、その前にお勉強しています。
 [Godot_v4.0-rc1_win64.exe.zip](https://downloads.tuxfamily.org/godotengine/4.0/rc1/Godot_v4.0-rc1_win64.exe.zip)を使用しています。

# 目的
　Godotの3D空間について方向と操作などを確認します。

# X,Y,Z座標の向き
　GODOT DOCSによると、ディフォルトでは右手系を採用しています。
　[Coordinate system](https://docs.godotengine.org/en/latest/tutorials/3d/introduction_to_3d.html#coordinate-system)

　GodotのX,Y,Zの向きは右上に表示されています（Godot4.0RC1ではたまに消えていますが...）。Ｘ軸が赤、Ｙ軸が黄色、Ｚ軸が青で、Ｘ，Ｙ，Ｚの文字がある方がプラスを表しています。
　![SampleCoord - Godot Engine 2023_02_20 21_51_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/d8b7df55-5f89-8e43-ff82-b29bcdc328e6.png)

　
　絵に書くとこんな感じです。
　X,Y軸は中学生～高校生の数学の授業で書いたグラフと同じ向きなので直感的だと思います。
　Ｚ軸は奥向きがFORWARD＝前進で、手前はBACK＝後退も直感的ですが、FORWARD＝前進がZ軸マイナス、BACK=後退がZ軸のプラス方向になることに注意が必要そうです。
　重力は下向き（Y軸のマイナス方向）に働きます。

　設定で変更できそうですが、特に不都合がなければGodotのディフォルトの設定に合わせようと思います。

　また軸に対する回転の正の方向も追記しました。
![GodotParts.pptx - PowerPoint 2023_02_22 23_05_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/a7984d8d-67ee-8c33-4b62-38fdce7c8103.png)
　回転方向を忘れたときは、右手を握って親指をたてます。親指の方向を軸のプラス方向に合わせたときに、指先が向いている方向が正の回転方向になります。
![kagaku_hand_migineji.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/af42dd06-8001-2a47-caa6-8d2a4c744acb.png)


# インスペクタ内のNode3D Transformのposition
　positionに値を入力するとノードの位置を変更することができます。また現在の位置をpositionで確認することができます。

　新規プロジェクトを作成して、3Dシーンを押下してNode3Dを追加します。
　Node3Dを右クリックして子ノードを追加からMeshInstance3Dを追加します。
　シーン内に追加されたMeshInstance3Dを選択した状態で、インスペクターのMeshの<empty>をクリックして、新規SphereMeshを選択すると、座標系の原点に球が表示されます。

　MeshInstance3Dを選択した状態で、画面右側のインスペクター内のNode3DのTransformを広げてpositionを確認すると、X:0m、Y:0m、Z:0mと表示されていて、球が原点にあることがわかります。

![(_) SampleCoord - Godot Engine 2023_02_20 22_08_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/5bc7361b-1c08-d350-214b-03527f7f620a.png)

　MeshInstance3Dを選択した状態で、インスペクター内のNode3DのTransformのpositionのXを１にしましょう（数字を入力してenterもしくはtabキーを押下する）。
　球の中心が右側、X軸のプラス方向に１ｍ移動しました。
　このように、インスペクター内のNode3DのTransformのpositionのx,y,zに値を設定すると、そのノードの位置を変更することができます。

![(_) SampleCoord - Godot Engine 2023_02_20 22_14_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/cc83e34b-dec9-dcf6-94c8-3097fa40c3cd.png)

　また球の周りの赤、青、黄色の矢印をドラッグすると球を移動することができます。
　移動した位置はインスペクタ内のNode3DのTransformのpositionで確認することができます。

# 単位はｍ（メートル）
　3D空間の単位はｍ（メートル）です。
　プレイヤーの大きさや背景の大きさもメートルで考える必要があります。ゲームのキャラクターや背景とのサイズを考えるときは身の回りのものに置き換えると設定しやすいかもしれないですね。
　グリッドの初期表示はX,Z軸方向に１ｍ間隔のようです。マウスホイールでズームアウトするとグリッドの大きさが変わり、8m間隔、64m間隔とかわるようです。

# ギズモ
　ノードを選択すると、Transformのpositionとrotationを操作できるギズモが表示されて、マウスで操作することができます。
　矢印をドラッグすると、positionを操作することができます。赤い矢印がX軸、黄色の矢印がY軸、青い矢印がZ軸でそれぞれの軸方向にドラッグすることができます。操作した後の値はインスペクタのNode3DのTransformのpositionで確認することができます。
　Ctrlキーを押下しながらドラッグするとグリッド単位に移動します。

　また赤い輪、黄色い輪、青い輪をドラッグすると、rotationを操作することができます。
　2軸以上（X軸周りとY軸周りを回転など）操作すると思ったのと違う姿勢になったりして難しいです。操作した後の値はインスペクタのNode3DのTransformのrotationで確認することができます。逆に数値を入力して詳細な調整をすることも可能です。

![(_) SampleCoord - Godot Engine 2023_02_20 22_54_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/7b2a25ee-967c-0dfb-a9af-0cd50c224122.png)

# 3D表示位置
　マウス操作で下記のような動きになります。

| 操作 | 効果 |
|:-----------|:------------|
| マウスホイールもしくはcontrol+中ボタンドラッグ | ズームイン・ズームアウト        |
| 中ボタンを押しながらマウスドラッグ    | 視点の回転 （画面中央あたりを中心）     |
| 右ボタンを押しながらマウスドラッグ    | 視点の回転（視点中心）      |
| shift+中ボタンを押しながらマウスドラッグ       | 視点の水平移動        |

また左上のほうにある透視投影をクリックすると表示されるメニューからも視点を変更できます。
![(_) SampleCoord - Godot Engine 2023_02_20 23_18_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/c9958503-bb01-c2af-8b96-db1363e11139.png)

| メニュー |
|:-----------|
|上面図|
|下面図|
|左側面図|
|右側面図|
|前面図|
|後面図|
|原点にフォーカス|
|選択対象にフォーカス|

# ビューポート
　ビューメニューからビューポートを複数表示することができます。
　![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/e11b40b4-296a-d921-fa5a-bd1e66c8168f.png)


# カメラ
　構図を決めるためにカメラを設置する必要があります。
　ビューポートを複数表示して（下記は２ビューポートの場合）、シーンの中のカメラを選択すると、プレビューチェックボックスが表示されます。プレビューをチェックするとそのビューポートは選択したカメラの構図になります。
　下のビューポートでカメラの見え方を確認しながら、上のビューポートでカメラのギズモを操作することができます。

![node_3d.tscn - SampleCoord - Godot Engine 2023_02_20 23_32_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/cbdc25c4-1ea1-9191-558d-ced4b9802969.png)


以上