//1. 資產信息
"ReferencePath":"/Game/ArchVizInteriorVol3/Meshes/SM_Bed.SM_Bed",//資產引用路徑
"Name":"SM_Bed",//資產名字

//2. 語義描述
"Description":"這是一張床",// 語音描述

//3. 幾何信息
"Pivot":"物體中心",//物體錨點
"GeometryInfo":{
"vertices":59997,//頂點數
"Triangles":"114502",//三角形數
"xxx":"" },
"BoundingBox":{
"center":[xx,xx],
"extend":[xx,xx]
},//包圍盒信息

//4. 基本材質信息
"Materials":[
{"MI_Bed_Fabric_1":[
"BaseColor":xxx,
"BaseFallof":xxx
]}
]
}

其中的大部分信息,我們可以在Unreal引擎中通過對模型資產基本信息的解析進行填充:

  1. 資產基本信息:如ReferencePath,這是模型在引擎中的索引路徑,可以根據索引路徑加載對應的模型
  2. 材質信息:主要的可以動態修改的材質參數
  3. 幾何信息:頂點數、UV信息等

但是只靠UE資產的信息解析顯然是不夠的,其中缺少關鍵的語義描述信息“Description。傳統的方法是基于人工打標的方式給3D模型進行打標,這些標簽便成為模型在語言空間的表示,并通過這些標簽在模型庫中進行搜索。這種方法不但費時費力,并且,如果想全面的描述一個模型,可能需要大量的tag進行標記:

我想要一張床 || 我想要一張雙人床 || 我想要一張現代風格的雙人床 || 我想要一個頂點數小一些的雙人床 || 我想要一個紅色的雙人床 || 我想要一張床上有個黑色小熊的紅色雙人床

為了能夠填充一個合適的語義描述信息,我們使用視覺-語言模型(Vision-Language Models, VLMs)進行描述信息的填充, 這種任務類型通常被稱為物體級標注:

物體級標注 要求模型生成單個3D物體的簡短自然語言描述。此描述應關注物體的關鍵特征,包括其形狀和語義特征。

在Unreal引擎中利用VLMs進行物體級標注,比如對于這樣一張床,讓通義千問VL-Max幫我們形成其描述信息,可以看到是非常準確的,大模型不僅幫我們總結了三維模型的主體構成部分,甚至連光影效果、設計風格等細節部分都進行了整理。

當把標注好的信息填充到模型描述文件的“Description”字段后,我們就完成了對一個三維模型的自然語言級別的表示。對所有的模型進行這個編碼后,我們便可以獲得一個自然語言空間下的三維模型庫,并通過“ReferencePath”這個字段與實體的三維模型進行關聯,核心步驟如下:

  1. 對于每個模型:
  2. 根據UE資產生成基本信息
  3. 生成大小為640×640的縮略圖
  4. options:生成多視角縮略圖
  5. 向大模型發起請求:Message{1. 這是一個三維模型的截圖,請幫我詳細描述這個三維模型的信息 2 Image[縮略圖]}
  6. 獲取大模型的返回,填充到Description字段
  7. 將模型描述信息填充到DataTable,并導出.csv文件

由此,借助VLMs,我們建立了每個模型在自然語言空間的表示。

收集所有的模型,即可建立一個自然語言空間下的三維模型庫。如下圖所示,并通過“ReferencePath”這個字段與實體的三維模型進行關聯。

模型搜索

至此能夠被大模型理解的模型的信息庫已經全部生成,下一步就是大模型如何利用這個信息庫,輔助我們進行模型的搜索,最終實現能夠根據用戶自然語言的輸入,輸出模型在引擎中的描述路徑“ReferencePath”,從而找到對應的三維模型實體。

我想要一張床 || 我想要一張雙人床 || 我想要一張現代風格的雙人床 || 我想要一個頂點數小一些的雙人床 || 我想要一個紅色的雙人床 || 我想要一張床上有個黑色小熊的紅色雙人床

為了能夠讓大模型感知到這個模型信息庫,我們使用大模型的知識檢索增強(RAG)能力,這里以阿里云百煉平臺+通義千問-max模型為例,結合我們3D模型表示過程中建立的三維模型庫的知識庫展示搭建一個智能體應用的過程,專門用于三維模型的搜索。

Assistant API 支持知識檢索增強(RAG)工具,讓智能體能夠根據您的需求獲取外部知識,例如私有產品知識或客戶的偏好信息。本文介紹了一個簡單的“手機導購”示例,幫助您快速上手RAG工具的基本使用方法。

步驟一:在“數據管理”-“結構化數據”下導入三維模型庫信息

步驟二:在“知識索引”-“創建知識庫”下導入上一步的知識,建立知識庫

步驟三:在“我的應用”-“新增應用”-“創建RAG應用”下,創建RAG應用,并配置剛剛建立好的知識庫,然后可以進行一些搜索的驗證。

步驟四:智能體應用調用,可以在Unreal引擎中通過HTTP的接口調用百煉的應用。

至此,我們便通過VLMs建立了每個三維模型的自然語言空間的表示,并借助大模型的RAG能力可以快速的找到符合我們自然語言描述的模型,大大的提高搜索效率。

二、基于大模型的3D場景理解

在有了3D模型的表示后,下一步就是形成場景級別的表示,被稱為3D場景理解,也被稱為場景級標注:

場景級標注 是為整個3D場景生成簡短自然語言描述。此類描述通常關注全局場景信息(如房間類型和風格)、場景中的關鍵物體及其關系。并建立與場景中的實體的一一映射關系,也即為每個場景中的實體增加語義標簽。

為了獲取場景級標注中的全局場景信息,以及關鍵物體及其關系,我們可以將不同視角下的場景截圖直接喂給VLMs,可以看到大模型不但給出了物體信息、布局信息、空間信息,而且就很多細節以及場景的特點都給出了準確的描述。然而這其中有個關鍵的Mapping問題:因為VLMs只提供了3D場景的抽象文本描述,未能建立描述與Unreal引擎場景內實體的對應關系。在Unreal引擎中的場景描述是一個一個的Actor,我們只知道其中有兩個大型吊燈,卻不知道哪個Actor是大型吊燈,從而接下來的三維場景交互也就無從說起。因此場景理解的關鍵點就是建立抽象文本描述與場景內的一一映射關系。

為了解決這個問題,我們有多種策略,本質上就是解決多對多的Mapping問題。

策略一:

核心思路:控制出現在場景截圖中的物體數量

核心步驟:

  1. 收集場景中的所有模型
  2. 隱藏所有模型
  3. 【for循環】對于每個模型
  4. 設置其可見性為true
  5. 根據BoundingBox計算相機位置,并移動相機到正確的位置
  6. 生成640×640的縮略圖
  7. options:生成多視角縮略圖
  8. 向大模型發起請求:Message {1. 這是一個三維模型的截圖,請幫我詳細描述這個三維模型的信息 2 Image}
  9. 獲取大模型的返回,根據3D模型的UUID,填充到對應物體的Description字段上

優勢:準確

劣勢:

  1. 在場景元素眾多的情況下,這個for 循環可能非常大
  2. 隱藏場景后,丟失場景輔助信息,可能識別不準,比如同樣是一個杯子,如果在咖啡廳環境下,可能被認為是一個咖啡杯,如果是在酒吧環境中,可能被認為是一個酒杯。

策略二:

核心思路:保留全部物體,使用實體的唯一標識符標記要重點識別的物體

核心步驟:

  1. 收集場景中的所有模型
  2. 隱藏所有模型
  3. 【for循環】對于每個模型
  4. 設置其可見性為true
  5. 根據BoundingBox計算相機位置,并移動相機到正確的位置
  6. 設置該模型為選中態,為該模型生成outline
  7. 生成640×640的縮略圖
  8. 向大模型發起請求:Message{1. 這是一個三維場景的截圖,其中關鍵物體已經被黃色框選中,請幫我詳細描述這個被黃色框選中物體的信息 2. Image}
  9. 獲取大模型的返回,獲取3D模型的UUID,根據UUID填充到對應物體的Description字段上

輸入:【高腳椅被選中】

輸出:

優勢:

  1. 準確
  2. 有場景輔助信息,增強場景整體邏輯的描述

劣勢:

  1. 在場景元素眾多的情況下,這個for 循環可能非常大

策略三:

核心思路:保留場景輔助信息的同時,在一個請求的情況下,使用實體UUID盡可能多的標記物體

核心步驟:

  1. 收集場景中的所有模型
  2. 【for循環】對于每個關鍵視角
  3. 視口內的Actor(實體模型)計算其屏幕空間的mask,并在該mask上添加該Actor的唯一標識符
  4. 生成640×640的縮略圖
  5. options:生成多視角縮略圖
  6. 向大模型發起請求:Message{1. 這是一個三維場景的截圖,我使用紅色框圈了一些主要物體,請給出這些方框分別描述了什么物體,以及對該物體進行描述,注意,如果方框內存在多個物體,返回的物體應該滿足以下要求:在所有存在方框內的物體,方框圈住該物體的比例占該物體全部范圍最大。以json格式輸出其物品類型以及描述。2 Image}
  7. 獲取大模型的返回,根據Key找到對應的Actor,然后將Value填充到Description字段
  8. 重復

輸入:【手動框選幾個主要物體,并標注】

輸出:

優勢:

  1. 準確
  2. 有場景輔助信息,增強場景整體邏輯的描述
  3. 同一張圖批量獲取模型信息,減少大模型調用次數

劣勢:

  1. 多物體可能存在遮擋情況,致使大模型判別不準

綜合使用如上幾種策略后,我們一方面可以獲取場景的全局場景信息(如房間類型和風格)、場景中的關鍵物體及其關系,也建立與場景中的實體的一一映射關系,同時我們也可以根據實體的唯一標識符收集一些引擎內的信息,如位置、錨點、空間關系等。綜合上述所有信息,可以形成這樣一份場景描述文件,這個場景描述文件+當前場景的截圖構成了大模型與3D場景之間相互握手的橋梁,輔助大模型認識、感知和理解3D場景。舉例:大模型通過圖片識別到場景中有幾把椅子,并通過場景描述文件,將圖片中的椅子與3D場景中的椅子建立了映射。

{
"name": "StaticMeshActor_1",
"uUId": "7D70F97241D37F14A1C649860C7FE24D",
"Description": "一張雙人床",
"transform":
{
"rotation":
{
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"translation":
{
"x": 0,
"y": 0,
"z": 0
},
"scale3D":
{
"x": 1,
"y": 1,
"z": 1
}
},
"boundingBoxCenter":
{
"x": 21.368782043457031,
"y": 1.3006591796875,
"z": 49.454704284667969
},
"boundingBoxExtent":
{
"x": 118.88101959228516,
"y": 112.37855529785156,
"z": 49.406597137451172
}
},
{
"name": "StaticMeshActor_2",
"uUId": "453F4F714546496132DA4EA97D22A636",
"Description": "一個書架",
"transform":
{
"rotation":
{
"x": -1.2325951644078309e-32,
"y": -0.70710678118654746,
"z": 6.1629758220391547e-33,
"w": 0.70710678118654735
},
"translation":
{
"x": 1.5,
"y": 0.5,
"z": 0
},
"scale3D":
{
"x": 1,
"y": 1,
"z": 1
}
},
"boundingBoxCenter":
{
"x": -24.001873016357415,
"y": 1.0605430603027344,
"z": -0.34783363342284446
},
"boundingBoxExtent":
{
"x": 25.503879547119134,
"y": 19.990333557128906,
"z": 19.498573303222656
}
}

三、對話式的3D世界交互

3D世界交互操作指的是自然語言與Unreal引擎內物體物理交互的能力,從移動物體到復雜的操作序列,如組裝零件或開門或者調整天氣等。在建立好三維模型表示以及能夠對場景進行理解后,使LLMs能夠執行操作任務的核心思想在于將動作序列標記化。為了讓LLMs輸出特定動作,然后Unreal引擎執行對應的動作,首先需要FunctionCall,使LLMs能夠根據任務和3D場景上下文生成這些FunctionCall。

舉例:

user: 我想要在場景中的桌子上放置一個杯子

大模型接收到這個邏輯后,會先去收集場景信息,確定桌子的位置信息等等,然后去三維模型庫去找杯子的ReferencePath,然后嘗試生成這個杯子到桌子上去,邏輯是這個邏輯,但是我們非常清楚,標紅的四個行為都是要對應一個函數調用的,要不然只能存在在語言層面,不會產生實際的行為。通過對對應Unreal引擎API的描述,讓大模型知道在放置對應模型時應該調用哪個Unreal函數以及提供什么參數

Function Calling(函數調用)使開發人員能夠描述函數(也稱為工具,您可以將其視為模型要執行的操作,例如執行計算或下訂單),并讓模型智能地選擇輸出包含參數的 JSON 對象來調用這些函數。

在上述例子中我們至少要添加如下幾個FunctionCall:

  1. GatherSceneInfo:負責發起場景理解,形成場景描述文件
  2. GetObjectReferencePath:負責根據用戶的描述,去RAG應用里搜索三維模型庫,然后返回ReferencePath等以及其他重要信息
  3. SpawnObject:根據Referencepath生成Actor
  4. MoveObject:根據輸入的Transform調整Actor的Transform

本例中我們以SpawnObjec為例,說明Function Call的流程:

  1. 在Unreal引擎內添加SpawnObject的函數,并實現生成物體的邏輯
  2. 描述Function
  3. 描述函數的名字、函數的描述、主要參數、主要參數的描述。
{            "type": "function",            "function":            {                "description": "在場景中生成或者放置一個物體",//描述函數的主要作用                "parameters":                {                    "type": "object",                    "properties"://描述函數的參數                    {                        "ReferencePath":                        {                            "type": "string",//描述函數的參數的類型                            "description": "要生成物體的ReferencePath" //描述函數的參數的含義                        },                        "description":                        {                            "type": "string",                            "description": "要生成物體的描述"                        },                        "pos_x":                        {                            "type": "number",                            "description": "物體在x軸上的位置"                        },                        "pos_y":                        {                            "type": "number",                            "description": "物體在y軸上的位置"                        },                        "pos_z":                        {                            "type": "number",                            "description": "物體在z軸上的位置"                        },                        "rot_x":                        {                            "type": "number",                            "description": "物體繞x軸的旋轉角度"                        },                        "rot_y":                        {                            "type": "number",                            "description": "物體繞y軸的旋轉角度"                        },                        "rot_z":                        {                            "type": "number",                            "description": "物體繞z軸的旋轉角度"                        },                        "scale_x":                        {                            "type": "number",                            "description": "物體在x軸上的縮放系數,默認為1.0"                        },                        "scale_y":                        {                            "type": "number",                            "description": "物體在y軸上的縮放系數,默認為1.0"                        },                        "scale_z":                        {                            "type": "number",                            "description": "物體在z軸上的縮放系數,默認為1.0"                        }                    },                    "required": [//描述調用該函數需要哪些參數                        "ReferencePath",                        "description",                        "pos_x",                        "pos_y",                        "pos_z",                        "rot_x",                        "rot_y",                        "rot_z",                        "scale_x",                        "scale_y",                        "scale_z"                    ]                },                "name": "spawn_object"            }        }
  1. 將該FunctionCall注冊到大模型。
  2. 模型發現需要調用該函數時會返回如下,解析這個命令,根據FunctionCall即可調用真正的Unreal函數來實現對應的功能。
LogChatGPT: Display: [CityV]: OpenAI call the function: [spawn_object] with args: {"ReferencePath": "/Game/ArchVizInteriorVol3/Meshes/SM_Bed", "description": "一張雙人床", "pos_x": 0, "pos_y": 0, "pos_z": 0, "rot_x": 0, "rot_y": 0, "rot_z": 0, "scale_x": 1.0, "scale_y": 1.0, "scale_z": 1.0}

當輸入為:“把杯子移動到咖啡桌的頂部中心位置”時,大模型會根據場景信息找到對應的杯子和咖啡桌,并計算移動的位置,然后發起FunctionCall,調用MoveObject方法,真正的在Unreal引擎中移動杯子到指定的位置。

四、總結

至此我們介紹了基于LLM打造實時可交互3D世界的要的三個核心模塊:

  1. 3D模型表示:告訴大模型如何“認識”3D模型
  2. 3D場景理解:告訴大模型如何“理解”3D場景
  3. 3D世界交互:通過FunctionCall的形式將LLM轉為Unreal引擎中實際可操作的函數。

總的來說,借助Unreal引擎和通義千問家族大模型,我們探索了LLMs與3D結合,在理解和與復雜3D世界互動方面的能力。

五、展望

大型語言模型(LLMs)的獨特優勢,如上下文學習、逐步推理、開放詞匯能力和廣泛的世界知識,它們在提升空間理解和交互方面的巨大潛力。將LLMs與3D數據融合,提供了一個獨特的機會,可以增強計算模型對物理世界的理解和互動,從而在多個領域引領創新,包括自動駕駛、具身智能、3D生成等。

自動駕駛領域:大模型在自動駕駛的數據標注、仿真和感知環節應用潛力十足。數據標注方面, 技術從人工標注轉為 AI 主導人工輔助。一方面,視覺大模型知識完備性好、精度高、泛化能力強;另一方面,自動駕駛數據積累和標注復雜度提高使數據標注工作量快速增加,AI 大模型的應用有助于加速數據標注并大幅降低數據生產成本。

具身智能領域:LLMs的規劃、工具使用和決策能力可以用于創建3D具身智能體。這些能力使LLMs能夠在3D環境中進行導航,與物體交互,并選擇適當的工具來執行特定任務。

3D生成領域:LLMs與3D結合可以改善傳統建模復雜且耗時的情況,根據語言可以生成情景化的對象或者場景。

總的來說,LLMs在處理、理解和生成3D數據的方法、應用展現了新興能力和強大的變革潛力,為空間智能的進一步發展鋪平道路。

文章轉載自:基于LLM打造沉浸式3D世界

上一篇:

如何獲取 Grok3 API 密鑰(分步指南)

下一篇:

在 Claude 上復刻 DeepSeek-R1 效果
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費