跳轉到內容

跨平臺遊戲程式設計與 gameplay3d/建立場景

來自 Wikibooks,開放世界的開放書籍


場景圖概述

[編輯 | 編輯原始碼]

場景圖是一種資料結構,用於定義圖形場景的空間(通常也包括邏輯)關係,以便高效管理和渲染圖形資料。

它通常表示為層次結構,包含一組節點,包括一個頂級的“根”節點,一些父節點,每個父節點可以有任意數量的子節點,以及一組葉節點,每個葉節點沒有子節點,因此共同構成樹的底層。

在 gameplay3d 中

  • 場景圖由 Scene 類表示;
  • Node 類例項可以附加到場景物件;
  • 可以將更多 Node 類例項作為現有節點的子節點新增;並且
  • 各種其他附件(例如模型、燈光、相機、物理物件)可以附加到任何節點;並且
  • 對父節點執行的操作會影響其所有子節點。
gameplay3d 場景圖的示意圖

建立場景、新增兩個節點並以程式設計方式(即不使用 .scene 檔案)附加相機和燈光的示例如下。該示例取自“sample-browser”專案中的“CreateSceneSample.cpp”。

// In your game class's initialize() method

// Create a new empty scene.
_scene = Scene::create();

// Create the camera.
Camera* camera = Camera::createPerspective(45.0f, getAspectRatio(), 1.0f, 10.0f);
Node* cameraNode = _scene->addNode("camera");

// Attach the camera to a node. This determines the position of the camera.
cameraNode->setCamera(camera);

// Make this the active camera of the scene.
_scene->setActiveCamera(camera);
SAFE_RELEASE(camera);

// Move the camera to look at the origin.
cameraNode->translate(0, 1, 5);
cameraNode->rotateX(MATH_DEG_TO_RAD(-11.25f));

// Create a white light.
Light* light = Light::createDirectional(0.75f, 0.75f, 0.75f);
Node* lightNode = _scene->addNode("light");
lightNode->setLight(light);

// Release the light because the node now holds a reference to it.
SAFE_RELEASE(light);

// Rotate the camera downwards.
lightNode->rotateX(MATH_DEG_TO_RAD(-45.0f));

通常,在使用 gameplay3d 製作遊戲時

  • 你會先載入/構建一個大型場景,代表遊戲關卡中需要的所有元件。這會在 Game::initialize() 中完成一次;
  • 在每次呼叫 Game::update() 方法時,你的程式碼會根據事件(例如使用者輸入)更新對節點和附加元件的更改;
  • 在每次呼叫 Game::render() 方法時,你的程式碼會遍歷場景並渲染場景中從場景的活動相機可見的部分;並且
  • 退出時,會呼叫 Game::finalize() 方法,在此過程中,你將釋放所有未完成的動態分配資源(參見 跨平臺遊戲程式設計與 gameplay3d/gameplay3d 設計概念#管理共享物件)。

以下元件可以附加到 gameplay::Node

可以附加到 gameplay::Node 類的元件
元件 描述
gameplay::Model 用於表示場景中的網格/幾何體。
gameplay::Camera 用於表示場景中的檢視/透視。
gameplay::Light 用於儲存燈光資訊,可以影響模型的渲染方式。
gameplay::PhysicsCollisionObject 用於定義將要模擬的基本物理動力學。
gameplay::ParticleEmitter 用於表示煙霧、蒸汽、火焰和其他大氣效果。
gameplay::Terrain 用於表示基於高度圖的地形。
gameplay::AudioSource 用於表示音訊播放的來源。
gameplay::Form 用於表示場景中的使用者介面。

關於變換順序的說明

[編輯 | 編輯原始碼]

模型和網格

[編輯 | 編輯原始碼]

其他節點附件

[編輯 | 編輯原始碼]

在建模軟體中建立場景資產

[編輯 | 編輯原始碼]

你可以使用任何能夠建立 FBX 檔案的建模軟體。由於一些 3D 建模軟體對該格式的支援水平相對較低,因此在 gameplay 2.0.0 中刪除了對 Collada 檔案的支援,但在未來如果採用率提高,可能會重新新增。

使用 Maya 建立場景資產

[編輯 | 編輯原始碼]

使用 Blender 建立場景資產

[編輯 | 編輯原始碼]

Blender 可以匯出 FBX(和 Collada)檔案。我們建議使用至少 2.70 版本。即將推出的 2.71 版本具有改進的 FBX 匯出功能,包括切線和副法線。

匯出 FBX 檔案

[編輯 | 編輯原始碼]

Blender 內建了 FBX 匯出器。版本 2.70 可以使用。請注意以下兩點重要說明,特別是如果你有動畫

  • Blender 和 Gameplay 具有不同的向上軸。匯出 FBX 檔案時,選擇向上軸為 Y 軸,向前軸為 Z 軸。如果沒有這個,動畫將完全變形
  • FBX 匯出器可以建立空的動畫通道。你必須使用 -oa 選項來轉換用於 gameplay 的檔案

將資產編碼為 .GPB

[編輯 | 編輯原始碼]

現在您的模型已經匯出到已知格式,為了使其可以正常使用,還需要完成最後一步。您的模型需要從匯出的交換格式 .FBX 轉換為遊戲框架可使用的有效二進位制捆綁格式。要執行此操作,請使用必要的引數執行 gameplay-encoder。

從 FBX (.FBX) 編碼

[編輯 | 編輯原始碼]

要將您的 FBX 場景檔案 (.fbx) 編碼為 gameplay 二進位制格式 (.gpb),請執行以下命令

gameplay-encoder -oa -g HIKCharacterNode_boy_Reference animations "../../gameplay-samples/sample-character/res/boy.fbx"

讓我們看一下傳遞到編碼器中的一些額外引數。

-g 引數表示您希望將 HIKCharacterNode_boy_reference 及其子節點上的所有動畫分組到一個名為“animations”的動畫中。-oa 選項表示您希望最佳化動畫。如果您從 Blender 匯入複雜檔案,這一點非常重要,否則可能會由於空動畫通道導致檔案無法讀取。

此編碼是必要的,因為 FBX(或者在字型的情況下,TrueType 檔案)實際上只是交換格式,並且是大型 ASCII 檔案,不建議用作執行時格式。對它們進行編碼會將它們打包到更有效的二進位制捆綁包中,並且只包含遊戲框架所需的資料。

使用 .scene 檔案

[編輯 | 編輯原始碼]

為了使用 .scene 檔案在 gameplay3d 中組裝場景,主要有兩個步驟

  • 建立一個描述您的場景的 .scene 文字檔案;以及
  • 透過呼叫 Scene::load() 靜態方法在您的遊戲程式碼中載入場景。

建立您的 .scene 檔案

[編輯 | 編輯原始碼]

在您的遊戲程式碼中載入場景

[編輯 | 編輯原始碼]

場景檔案可以按照以下方式載入到您的遊戲中

// Load the scene
_scene = Scene::load("res/myscene.scene");
華夏公益教科書