3D 簡介

創造一個 3D 遊戲是具有挑戰性的。多了額外的 Z 軸使得許多有助於使製作 2D 遊戲變得簡單的常用技術不再起作用。為了幫助習慣這,值得一提的是,Godot 在 2D 和 3D 中使用了類似的API。大多數的節點都是相同的,並且存在於 2D 和 3D 版本中。事實上,可以看看 3D 平台遊戲教學或 3D 動力學角色教學,這些教學大部分與 2D 遊戲相同。

在 3D 中,數學比在 2D 中稍微複雜一些,因此查看 wiki 中的 Vector math (這是專門為遊戲開發人員創建的,而不是數學家或工程師)將有助於為您有效地開發 3D 遊戲。

Spatial 節點

Node2D 是 2D 的基礎節點。 Control 是所有 GUI 的基礎節點。同理,3D 引擎使用 Spatial 節點來處理所有 3D 內容。

../../_images/tuto_3d1.png

Spatial節點有一個局部變換(local transform),它是相對於父節點的(只要父節點也是 或者繼承自 Spatial 類型)。這個變換(transform)可以以 4×3 的 Transform 形式訪問,也可以以 3 個 Vector3 成員並分別代表位置、歐拉旋轉(X、Y、Z 角度)和縮放的形式訪問。

../../_images/tuto_3d2.png

3D 內容

2D 中載入圖像內容和繪圖都非常直觀,3D 則有所不同,會稍微困難一些。3D內容需要使用特殊的 3D 工具(通常稱為數位內容創建工具或Digital Content Creation工具,簡稱DCC)來創建,並匯出成可被 Godot 匯入的交換文件格式。這是必需的,因為 3D 格式不像圖像那樣標準化。

DCC 創建的模型

有兩種管道可以匯入 3D 模型到 Godot 中。第一種是最常見的一種,是通過 匯入 3D 場景,它允許匯入整個場景(就像它們在DCC中呈現的那樣),包括動畫、骨架綁定、混合形狀等。

第二種管道是通過匯入簡單的 .OBJ檔作為網格資源,然後可以將其放入 MeshInstance 節點中顯示。

生成的幾何體

通過直接使用 ArrayMesh 資源可以創建自定義幾何體。只需要創建陣列並使用 ArrayMesh.add_surface_from_arrays(),他提供了一個更直接的 API 和幫助工具,用於索引、生成法線和切線等。

在任何情況下,此方法都適用於生成靜態幾何體(不會經常更新的模型),因為創建頂點陣列並將它們提交給 3D API 會產生顯著的性能成本。

即時幾何體

相反,如果需要生成會經常更新的簡單幾何體,Godot 提供了一個特殊的節點 ImmediateGeometry,它提供了一個 OpenGL 1.x 風格的即時模式 API 來創建點、線和三角形等。

3D環境中的2D

雖然 Godot 包含強大的 2D 引擎,但許多類型的遊戲在 3D 環境中使用 2D 效果。通過使用不旋轉的固定相機(正交或透視),可以使用諸如 Sprite3DAnimatedSprite3D 等節點來創建混合了具有3D背景,更逼真的視差,光照/陰影效果等的 2D 遊戲。

當然,缺點是與普通2D相比增加了複雜性並降低了性能,並且缺乏以像素製作時的參考。

環境

除了編輯場景之外,編輯環境通常也很常見。 Godot 提供了一個 WorldEnvironment 節點,該節點允許更改背景顏色、模式(如放置一個天空盒時那樣),並應用多種類型的內置後處理效果。環境也可以在相機中被覆蓋。

3D 視窗

編輯 3D 場景可以在 3D 分頁中完成。此分頁可以手動選擇,但在選擇 Spatial 節點時會自動啟用。

../../_images/tuto_3d3.png

預設的3D場景導航控制類似於 Blender(旨在在免費軟體工作流程中具有某種一致性),但在編輯器設定中也包含了自定義滑鼠按鈕和行為的選項,能使編輯器操作可像其他的工具:

../../_images/tuto_3d4.png

座標系

Godot 在 3D 中使用的都是 `公制(metric)<https://zh.wikipedia.org/wiki/%E5%85%AC%E5%88%B6>`__ ,1 個單位等於 1 公尺。物理和其他區域都針對這個進行了調整。因此,嘗試使用不同的比例通常是個壞主意(除非您知道自己在做什麼)。

使用 3D 素材時,最好使用正確的比例(將 DCC 設置為公制)。 Godot 允許在匯入後縮放,雖然這在大多數情況下都有效,但在極少數情況下,它可能會在算繪或物理等精細領域引入浮點精度問題(會出現毛刺或失真)。所以請確保藝術家始終以正確的比例工作!

The Y coordinate is used for "up", though for most objects that need alignment (like lights, cameras, capsule collider, vehicle, etc.), the Z axis is used as a "pointing towards" direction. This convention roughly means that:

  • X is sides

  • Y is up/down

  • Z is front/back

Space and manipulation gizmos

Moving objects in the 3D view is done through the manipulator gizmos. Each axis is represented by a color: Red, Green, Blue represent X, Y, Z respectively. This convention applies to the grid and other gizmos too (and also to the shader language, ordering of components for Vector3, Color, etc.).

../../_images/tuto_3d5.png

Some useful keybindings:

  • To snap placement or rotation, press Ctrl while moving, scaling or rotating.

  • To center the view on the selected object, press F.

View menu

The view options are controlled by the "View" menu in the viewport's toolbar.

../../_images/tuto_3d6.png

You can hide the gizmos in the 3D view of the editor through this menu:

../../_images/tuto_3d6_1.png

To hide a specific type of gizmos, you can toggle them off in the "View" menu.

../../_images/tuto_3d6_2.png

Default environment

When created from the Project Manager, the 3D environment has a default sky.

../../_images/tuto_3d8.png

Given how physically based rendering works, it is advised to always try to work with a default environment in order to provide indirect and reflected light to your objects.

攝影機

No matter how many objects are placed in the 3D space, nothing will be displayed unless a Camera is also added to the scene. Cameras can work in either orthogonal or perspective projections:

../../_images/tuto_3d10.png

Cameras are associated with (and only display to) a parent or grandparent viewport. Since the root of the scene tree is a viewport, cameras will display on it by default, but if sub-viewports (either as render target or picture-in-picture) are desired, they need their own children cameras to display.

../../_images/tuto_3d11.png

When dealing with multiple cameras, the following rules are enforced for each viewport:

  • If no cameras are present in the scene tree, the first one that enters it will become the active camera. Further cameras entering the scene will be ignored (unless they are set as current).

  • If a camera has the "current" property set, it will be used regardless of any other camera in the scene. If the property is set, it will become active, replacing the previous camera.

  • If an active camera leaves the scene tree, the first camera in tree-order will take its place.

光照

Godot has a limit of up to 8 lights per mesh. Aside from that, there is no limitation on the number of lights, nor of types of lights, in Godot. As many as desired can be added, as long as performance allows, and no more than 8 lights shine on a single mesh.