Godot入門到棄坑——3D引入


3樓貓 發佈時間:2024-10-24 13:32:28 作者:cameLcAsE Language

Godot 4.3已於2024年8月15日發佈,此後的文章(直到我又說換版本了為止)以4.3版本為基準
為了便於後續的學習,我們先來新建一個項目,叫它FPS或者什麼都可以。
Godot項目在創建時不區分2D和3D,在遊戲中同時存在2D場景和3D場景也不是什麼稀奇事。渲染器默認就可以。
項目不區分2D和3D,但是場景需要區分。為了構建一個3D遊戲,我們至少需要一個3D場景。新建場景,選擇3D Scene
打開3D場景後,視口默認切換到3D模式。
3D場景默認情況下根節點是Node3D,它和2D場景中的Node2D是對等的。

認識Godot的3D座標系

3D座標系毫無疑問有三個軸。按照慣例,Godot的3D座標系的座標軸也用x、y、z表示。一般來說這和數學課上用的字母一樣。
雖然一般來說各種軟件中的2D座標系都是橫軸為x,縱軸為y,但是它們在3D座標系上有很大分歧。
Godot的3D座標系使用的是y軸指向上方的右手座標系。
換句話說,伸出右手的大拇指、食指、中指,食指向上,令三個手指相互垂直。食指指的就是y軸正方向,中指是z軸正方向,大拇指指向x軸正方向。
Godot的文檔中引用了一張圖片,展示了常用3D軟件的3D座標系情況:
可以看到Unreal實在是獨樹一幟

可以看到Unreal實在是獨樹一幟

在3D空間中導航

為了便於在開發過程中觀察3D場景,我們要學習如何在3D場景中導航。
鼠標位於3D視口中時,按住右鍵後即可像玩FPS遊戲那樣移動鼠標觀察場景。同時,你也可以用WASD來前後左右移動(以當前視線方向為前方)。E和R分別是上升和下降(沿Y軸方向移動)。鼠標滾輪可以將視角拉近拉遠。
按住鼠標中鍵,可以讓視角環繞畫面中心旋轉——注意這和2D視口中不一樣。2D視口中鼠標中鍵是用於平移(pan)整個畫面,3D視口中的平移需要按住shift再按鼠標中鍵移動。
右上角的這個玩意兒是另一種用來觀察場景的工具。在它身上按住鼠標左鍵並移動就類似於按住鼠標中鍵的操作。點擊上面的圓球可以讓視角快速調整到對應座標軸的方向:
可以看到除了視角變了之外,左上角也發生了變化。原本的Perspective(透視)變成了Right Orthogonal(右側正交)。
透視簡單來說就是“近大遠小”的效果,看起來“更有立體感” :
而正交的視角則是這樣,該平行的邊還是平行:
在只想要觀察某一個側面的狀況時,正交的畫面更容易觀察。
最後,工具欄的View菜單下可以選擇各種多視口視圖,可以同時觀察場景的不同角度:

創建簡單的3D對象

在開發遊戲時,有一些簡單的3D對象可供實驗和關卡打樣是很方便的。
我們在2D遊戲的開發過程中,我們想使用一些臨時素材來打樣的時候都是直接放一個紋理(texture)——或者直接說“圖片”——到場景中。畢竟圖片本身就是2D的,直接放在2D場景中很自然。
在3D場景中,我們自然要放一些3D模型到場景中。2D場景中我們把圖片放到場景中會自動創建一個Sprite節點,然後圖片會作為它的texture屬性;又或者我們直接選擇新建紋理,用Placeholder紋理或者其它選項來作為Sprite的內容。那麼3D場景中對應的是什麼呢?
MeshInstance3D(網格實例3D)節點用於在場景中渲染網格。啥是網格呢?你可以簡單地認為它就是3D模型的同義詞。為啥叫網格呢。因為3D模型是有很多頂點連成邊、邊又連成面形成的,這些數據最終會被計算機渲染成看起來貌似很有立體感的東西:
一個簡單的3D模型,其中可以看到若干頂點(黑點)

一個簡單的3D模型,其中可以看到若干頂點(黑點)

向場景中加入一個MeshInstance3D節點。MeshInstance3D加入場景後和Sprite類似,不會顯示任何內容。我們需要給它的Mesh屬性賦值。類似地,我們可以在Mesh屬性的下拉菜單中看到一系列內置的選項:
如你所見,除了PlaneMesh之外還有很多種選項可以選。其實不用我介紹,看一眼左邊的圖標大概也能猜到各自對應的是什麼。你可以自行探索。
實際上你也可以看到一個Placeholder。這種Mesh會用位置和長寬高定義一個只顯示邊框的立方體:
這裡我們也可以選擇PlaneMesh(平面)來做一個地面:
類似於Sprite的Texture屬性,這裡填入值之後可以點擊它來編輯它的各種屬性。這裡可以通過Size來調整其大小。平面沒有高度(但凡有一點高度的那就是一個立方體了),所以這裡只有兩個分量。

操作3D對象

接下來我們可以利用這些基本的幾何體做一個簡單的關卡。你可以隨心所欲地擺弄這些東西,當然我這裡就簡單用BoxMesh(立方體)來講解一下。
這裡新建一個MeshInstance節點,給它一個BoxMesh。默認情況下,這個立方體是邊長為1的正方體。現在我希望通過調整它的尺寸,來做一面牆。
在調整尺寸這個問題上,我們這裡有兩種操作方式。BoxMesh作為一種在引擎內構造的網格資源,可以直接調整其參數來調整大小。
另外,3D節點和各種2D節點一樣,有一系列transform屬性。它的scale屬性也是用於對3D對象進行縮放。自然,3D的scale有三個分量,是一個Vector3D類型的屬性,分別令3D對象沿對應的軸進行縮放。
區別在於,直接調整Mesh資源自身的屬性不會影響MeshInstance節點的transform。反之亦然。不過調整兩者任意的大小都會在視覺上發生變化。另一方面提醒一下。我們在前面已經瞭解到,資源是共享的
例如在嘗試做一堵簡單的牆的時候,你做完一面之後,可能會想要直接複製(duplicate)這個MeshInstance。複製發生時,節點引用的資源不會產生新的副本(copy),它們會引用同一個資源——這本身就是資源的特點。因此此時如果你再去任意一個MeshInstance節點上修改那個Mesh的話,所有引用同一個Mesh的節點都會發生變化。你不妨嘗試一下。
因此,具體如何調整,還是那句老話,需要根據具體需要來。
3D視圖和2D視圖有類似的工具欄可以操作場景中的各種3D對象或者說節點。默認情況激活的是選擇工具(圖標為鼠標,快捷鍵為Q)。點擊任意3D節點會顯示這個看起來亂七八糟的紅藍綠的東西:
這些3D軟件中很常見的UI元素一般稱為gizmo,它們用來對3D節點進行移動、旋轉、縮放等操作。選擇模式下實際上是把幾種工具同時顯示了出來。我們可以進入對應模式單獨操作,也可以在選擇模式下執行各種不同的操作。
按下W激活移動工具,除了比2D多一個軸以外沒有什麼區別。鼠標在某個軸上按住並拖動可以讓節點沿某個軸移動。和2D不一樣的是這裡還有三個方框一樣的東西。按住它們可以把移動限制在對應平面上而不是某個軸上。
按下E激活旋轉工具。沒啥說的。
R是縮放工具。和移動工具類似,它也支持在某個平面上操作。
最後,按下Q可以同時激活這些工具,就得到了一開始的效果。

CSG——關卡打樣的好幫手

CSG它不是CS Go的意思。它是Constructive Solid Geometry(我其實不太清楚這個constructive用在這裡是否恰當,但是總是大概就是“可以構造的實心幾何體”)的縮寫。和內置的各種簡單幾何體Mesh相比,可以利用CSG構造出更復雜的網格。
例如在場景中加入一個CSGBox。咋一看和一般的BoxMesh沒啥區別。不過CSG提供了幾個錨點,可以直接調整其尺寸。
你說好吧,可能方便一點,這也沒啥神奇的。現在加入另一個圓柱體,並在監視面板或者場景中調整其尺寸。當然默認的圓柱體只有8個稜,看起來不圓,可以在檢視面板調整它的slides。最後把它大概調整成這樣,然後插入到CSGBox中:
好吧,到現在為止還是沒什麼神奇的。接下來,我們把圓柱體的CSGShape下的Operation(操作)屬性調整為Subtraction(減去)——依然沒有什麼神奇的。
接下來才是見證奇蹟的時刻。在場景中加入一個CSGCombiner節點,然後把剛才這兩個CSG作為它的子節點
可以看到,圓柱體看不見了(不過節點本身依然在場景中),並且立方體被圓柱體打了一個洞:
這就是CSG的有趣之處。它可以像諸多3D軟件那樣對網格進行布爾操作,讓不同的幾何體相互影響來構造複雜的幾何體。
CSG對其它的CSG產生什麼影響就依賴於剛才的Operation屬性。其取值有三,默認為Union,按照集合論的術語來說就是求並,按照布爾代數的術語來說就是與。總之就是把兩個CSG合併成一個物體。Subtract已經見過,就是求差集,即從一個CSG上消除掉和另一個CSG重合的部分。Intersection是求交集,也就是隻保留兩個CSG重合的部分,消除其它的部分:
Combiner不止可以組合兩個CSG,你可以按照這樣的操作構造各種不同的、更為複雜的幾何體來搭建你的場景。
如果你想搭建的幾何體的基本形狀不是那麼基本,也可以選擇用CSGPolygon。Polygon是多邊形的意思,CSGPolygon會利用多邊形來構造網格,其實在很多3D軟件中這種建模方式也很常見。
CSGPolygon提供的錨點用於定義一個多邊形,且這些錨點都在一個平面上。默認只有四個頂點,如果需要添加更多頂點可以在檢視面板中的Polygon屬性中編輯:
可以看到,默認情況下會用這個多邊形朝一個方向構造一個一定深度(厚度)的幾何體。“面動成體”嘛。
這種行為是由CSGPolygon的Mode屬性控制的,默認為Depth(深度),深度默認為1米:
這個操作說白了就是3D軟件裡的“擠出”(extrude)操作。
Mode有三個選項。Spin(旋轉)就是讓這個多邊形旋轉起來以形成一個幾何體:
剩下的Path(路徑)就是讓多邊形沿一條曲線移動形成幾何體。此模式需要場景中有一個Path3D節點。Path3D節點需要引用一個曲線資源。曲線也是自己通過控制點來定義。提示一下,如果發現曲線“太直了”的話,選中視口左上方那排按鈕第二個,然後按住shift去調整控制點就可以出現貝塞爾曲線那種把手了。
總之,利用CSG和一些基本的MeshInstance,我可以(也不是特別)輕鬆地搭建這樣一個場景:
至此你的場景可能已經搭建好了。你可能滿心激動地準備啟動遊戲看一看。可是啟動遊戲之後什麼都沒有。

再次開拍

和2D場景不一樣,3D場景必須要一個攝像機節點才能在遊戲運行時渲染畫面。
我們之前已經瞭解到2D場景中可以加入一個Camera2D節點用來控制2D遊戲的畫面,類似地,我們有一個Camera3D節點。
加入Camera3D節點後選中它,在3D視圖中可以看到一個Preview(預覽)按鈕:
勾選後編輯器的3D視口中可以預覽透過此攝像機看到的畫面。
然而,啟動遊戲我們會發現畫面中雖然有我們的場景,但是是黑乎乎的。

亮起來

在3D場景中,如果我們沒有加入WorldEnvironment(世界環境)節點或者DirectionalLight3D(方向光)節點,編輯器會自行啟用預覽環境,這樣我們就不會在編輯器中看到黑乎乎的場景。在工具欄可以看到,這個像太陽和地球的圖標顯示為啟用狀態:
這兩個圖標分別就是控制是否啟用3D預覽太陽光和預覽環境。點擊可以切換啟用狀態。關閉兩者後我們在編輯器中看到的就是和剛才在遊戲運行時看到的那樣黑乎乎的。
另外點擊地球旁邊的三個點可以對預覽太陽光和環境進行一些設定。當然,無論怎麼設定,它們都不會影響到我們的實際遊戲,畢竟它們是預覽用的。
現在我們可以先關閉預覽太陽光和預覽環境,然後自行添加相應節點來構造遊戲場景的環境。當然,“關閉”不是必須的操作,只是可以更好地對比場景在操作前後的樣子。
基本的光照通過Light3D派生出來的各節點實現。環境中的太陽光一般通過DirectionalLight3D來實現——它的圖標就是一個太陽。
Light3D本身也是Node3D的子類,它自然有各種transform屬性。不過,方向光主要用來模擬一種從很遠很遠的照射過來的、各光線幾乎平行的光源。就像太陽在不同的位置時地球上某點的光照情況也各不一樣,調整其rotation屬性可以控制光照的方向。不過移動它的位置並不會對光照有什麼具體影響。
另外要注意,可以看到我們手動加入DirectionalLight3D節點之後,場景中的預覽太陽光按鈕就直接禁用了。
現在,場景中有光了,部分場景節點已經被照亮,沒照亮的部分也有了明暗對比。但是我們的場景中沒有背景,也就是說沒有節點擋住的遠處還是一片黑(灰):
WorldEnvironment節點用於控制整個場景的各種光照、背景、後處理屬性。加入此節點後,預覽環境和太陽光一樣自動禁用。為了達到預覽環境的簡單效果,我們選中這個節點,然後在檢視面板原地新建一個環境:
其背景(Background)屬性有多種模式,默認情況下使用的是清空為默認顏色(Clear Color),也就是這個灰濛濛的顏色。如果你只希望要一個單色背景的話,可以選擇Custom Color然後選擇任意顏色。這裡我們選擇Sky。
其背景(Background)屬性有多種模式,默認情況下使用的是清空為默認顏色(Clear Color),也就是這個灰濛濛的顏色。如果你只希望要一個單色背景的話,可以選擇Custom Color然後選擇任意顏色。這裡我們選擇Sky。
選擇Sky後,下方也會多出一欄Sky相關的屬性。類似地操作新建Sky,遠處看起來是什麼樣子的主要靠天空的材質控制——而材質也支持多種材質。當然最簡單的就是選擇ProceduralSkyMaterial,默認的預覽天空大致就是用它實現的。你可以點擊它進一步調整相關屬性來控制天空的顏色之類的。
現在啟動遊戲,應該就能看到一個被照亮的場景了。
總之,我們現在有了一個3D場景,可以製作3D遊戲了!

© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com