Qt Quick 3D介绍:Qt Quick的高级3D API
目錄
- 我們的目標是什么?為什么提出另一個3D解決方案?
- 統一圖形技術
- 直觀易用的API
- Qt Quick的統一工具
- 一流的素材優(yōu)化管道
- 跨平臺性能和兼容性
- Qt Quick 3D到底是什么?
- 您能用Qt Quick 3D做什么?
- 節(jié)點/Node
- 攝像機/Camera
- 光照/Light
- 模型/Model
- DefaultMaterial 和 Custom Materials
- 紋理/Texture
- 可用功能示例
- Qt Quick內置的3D視圖
- 3D中的2D視圖
- 3D QML組件
- 同一場景的多個視圖
- 陰影/Shadow
- 基于圖像的光照/ Image Based Lighting
- 動畫/ Animations
- 如何親自嘗試?
- 關于工具
- 將3D場景導入QML組件
- 轉換Qt 3D Studio項目
- 關于Qt 3D
- 未來的計劃是什么?
- 非常期待您的反饋!
本文翻譯自:Introducing Qt Quick 3D: A high-level 3D API for Qt Quick
原文作者:Andy Nichols
校審:王富涌、Richard Lin
正如Lars在他的Qt 6技術概覽一文中提到的,我們一直在研究如何在3D和Qt Quick之間進行更深入的集成。因此,我們創(chuàng)建了一個名為Qt Quick 3D的新項目,提供高級API,用于從Qt Quick為用戶界面創(chuàng)建3D內容。 我們沒有使用會導致動畫同步問題和需要多層抽象的外部引擎,而是在Qt Quick Scenegraph中擴展了3D的部分,并為這些擴展的場景圖節(jié)點(scene graph node)提供了對應的渲染器。
這并不意味著我們?yōu)镼t編寫了另一個3D解決方案,因為核心的場景渲染器是從Qt 3D Studio的渲染器派生出來的。這個渲染器被移植過來,使用Qt的平臺抽象層,并被重構以滿足Qt項目的編碼風格。
我們的目標是什么?為什么提出另一個3D解決方案?
統一圖形技術
我們最重要的目標是統一我們的圖形技術。目前,我們?yōu)閯?chuàng)建流暢的用戶界面提供了兩種綜合解決方案來,每個解決方案都有自己的相應工具。其中一個解決方案是處理2D的Qt Quick,另一個是用于3D的Qt 3D Studio。如果只使用其中一種,事情通常會很順利。然而,我們發(fā)現用戶通常需要混合使用,這在運行時的性能以及開發(fā)者/設計師體驗方面都會造成許多問題。
因此,為了簡便起見,我們的目標是擁有一個運行時(Qt Quick)、一個通用場景圖(Qt Quick Scenegraph)和一個設計工具(Qt Design Studio)。而且不會對特性、性能或開發(fā)者/設計師的體驗造成任何影響。這樣,我們就不需要在復雜的產品線中分散我們的開發(fā)焦點,可以更快地添加更多特性和修復bug。
直觀易用的API
Qt Quick 3D的下一個目標是提供一個用于定義3D內容的API,開發(fā)者不需要了解現代圖形管道的復雜細節(jié)就可以使用這個API。畢竟,大多數用戶不需要為每個應用程序創(chuàng)建專門的3D圖形渲染器,而只是想顯示一些3D內容,通常是與2D一起顯示。因此,我們在開發(fā)Qt Quick 3D的過程中一直牢記這一點。
也就是說,接下來我們將會公布越來越多的渲染API,這將使高級用戶可以實現更高級的用例。
在撰寫本文時,我們只提供了一個QML API,但是我們的目標是提供一個公共的C++ API。
Qt Quick的統一工具
Qt Quick 3D旨在成為Qt 3D Studio的繼承者。目前Qt 3D Studio仍將繼續(xù)開發(fā),但從長遠來看,將被Qt Quick和Qt Design Studio所取代。
在這里,我們打算把Qt 3D Studio最好的部分融合到Qt Quick和Qt Design Studio中。不再需要為Qt Quick或3D提供單獨的工具,而是在Qt Design Studio中同時完成這兩項工作。我們現在正在研究這方面的細節(jié),希望不久就能發(fā)布預覽版。
對于Qt 3D Studio的現有用戶,我們一直在開發(fā)一個移植工具,可以將項目轉換為Qt Quick 3D。稍后會有詳細介紹。
一流的素材優(yōu)化管道
在處理3D場景時,素材優(yōu)化正日益重要,因為現在的圖形素材類型越來越多,而且體量也越來越大。因此,作為Qt Quick 3D開發(fā)工作的一部分,我們一直在研究如何盡可能方便地導入您的數據,并將其轉換為Qt Quick中使用的,高效的運行時格式。
例如,在設計時,您會使用創(chuàng)建工具生成的圖形素材(例如,Maya中處理3D模型的FBX文件,或者Photoshop中處理紋理的PSD文件),但是在運行時,您就不會希望引擎使用這些格式。取而代之,您希望將素材轉換成某種高效的運行時格式,并在每次源設計修改時更新它們。我們希望將這一過程盡可能自動化,因此希望將它們整合到Qt構建系統和工具中。
跨平臺性能和兼容性
我們的另一個目標是通過Qt新的渲染硬件接口(Rendering Hardware Interface,縮寫RHI),使它支持多種原生圖形API。目前,Qt Quick 3D如Qt中其他許多組件一樣,只能使用OpenGL渲染。但是在Qt 6中,我們將使用QtRHI作為我們的圖形抽象層,除了OpenGL之外,我們還將支持Vulkan、Metal和Direct3D渲染。
Qt Quick 3D到底是什么?
Qt Quick 3D的目標不是替代Qt 3D,而是Qt Quick的功能性擴展,渲染3D內容的高級API。
下面是一個非常簡單的項目,附帶注釋:
其理念是,定義3D內容應該像定義2D內容一樣簡單。您需要一些額外的東西,比如燈光、攝像機和材質等概念,但是所有這些都是高級場景概念,而不是圖形管道的實現細節(jié)。
當然,簡單的API會導致功能上的限制。盡管可以定制材質和場景的內容,但不可能完全定制場景的渲染,這與Qt 3D中使用的高度可定制的framegraph不同。Qt Quick 3D用一個固定的正向渲染器,您可以用屬性來定義如何渲染場景中的對象。這與其他現有的引擎類似,通常有一些渲染管道可供選擇,然后使用這些管道渲染邏輯場景。
在一個帶有軸線和網格線的天空盒中,攝像機圍繞著一個汽車模型旋轉(備注:卡頓的原因是其為一個12 FPS的GIF圖像)。
您能用Qt Quick 3D做什么?
它可以做很多事情,但是這些都是使用以下場景元素構建的:
節(jié)點/Node
節(jié)點是3D場景中的基本組件。它代表了3D空間中的坐標變換,但它是不可見的。其工作原理類似于Qt Quick中的Item類型。
攝像機/Camera
攝像機表示場景是如何投影到2D表面的。相機在3D空間中有一個位置(因為它是節(jié)點子類)和一個投影。要渲染場景,您至少需要有一臺攝像機。
光照/Light
光照組件定義了場景中的光源,照亮了考慮照明的所有材質。現在,有三種類型的燈光:指向型光源(默認)、點光源和面光源。
模型/Model
模型組件是場景中的一個可視化組件。它代表幾何圖形(從網格)和一種或多種材質的組合。
網格組件的源屬性需要一個. mesh文件,這是Qt Quick 3D使用的運行時格式。要獲取網格文件,您需要使用素材導入工具轉換3D模型。還有一些內置元素。需要設置以下源屬性:#Cube, #Cylinder, #Sphere, #Cone, 或 #Rectangle.
我們還將添加一種可編程的方式,在運行時動態(tài)添加自定義模型組件,但它在預覽版本中暫時不可用。
在渲染模型之前,它還必須要有材質。這里定義了網格的著色方式。
DefaultMaterial 和 Custom Materials
DefaultMaterial組件是一種易于使用的內置材質。您所需要做的就是創(chuàng)建這個材質,設置您想要定義的屬性,后臺會自動生成所有必要的著色器代碼。您在場景中設置的所有其他屬性也會被考慮在內。不需要自己編寫任何圖形著色器代碼(如頂點著色器或片段著色器)。
也可以使用所謂的CustomMaterials,您可以在其中提供自己的著色器代碼。我們還提供了一個預定義的定制材料庫,您只需在QML中添加以下內容即可試用:
紋理/Texture
紋理組件表示3D場景中的紋理,以及它是如何映射到網格的。紋理的來源可以是圖像文件,也可以是QML組件。
可用功能示例
Qt Quick內置的3D視圖
要查看Qt Quick內部的3D內容,有必要將其展平為2D曲面。為此,您可以使用View3D組件。View3D是整個API中唯一基于QQuickItem的組件。您可以將場景定義為View3D的子元件,也可以將scene屬性設置為要渲染的場景的根節(jié)點來引用現有場景。
如果您有多臺攝像機,也可以設置要使用哪臺攝像機來渲染場景。默認情況下,它將只使用場景中定義的第一個活動攝像機。
在渲染之前值得注意的是,View3D 元素不一定要渲染到離屏紋理(off-screen texture)。可以設置以下四種渲染模式之一來定義如何渲染3D內容:
3D中的2D視圖
可能您想在3D場景中渲染Qt Quick內容。為此,在任何將紋理作為屬性值的地方(例如,在默認材質的diffuseMap屬性中),您都可以使用Texture元件,該元件設置了sourceItem屬性,而不僅僅是指定文件。這樣,引用的Qt Quick 元素將被自動渲染并用作紋理。
映射到立方體的漫反射顏色紋理是動態(tài)的Quick 2D元素。
3D QML組件
由于Qt Quick 3D是基于QML構建的,因此也可以為3D創(chuàng)建可重用的組件。例如,如果您創(chuàng)建了一個包含多個模型組成的汽車模型,只需將其保存到Car.qml中,然后您就可以通過重用它來實例化多個汽車實例,就像任何其他QML類型一樣。這非常重要,因為這樣可以使用相同的組件模型創(chuàng)建2D和3D場景,而不必為2D和3D場景提供不同的處理方法。
同一場景的多個視圖
因為場景定義可以存在于Qt Quick項目中的任何地方,所以可以從多個View3D中引用它們。如果場景中有多臺攝像機,甚至可以從每臺攝像機渲染到不同的View3D。
同一茶壺場景的四個視圖。在投影視圖中也在三臺攝像機之間變化。
陰影/Shadow
任何光照組件都可以指定它正在投射的陰影。啟用此選項后,場景中將自動渲染陰影。根據您正在做的事情,渲染陰影可能非常耗時,因此您可以通過在模型上設置附加屬性來微調哪些模型組件投射和接收陰影。
基于圖像的光照/ Image Based Lighting
除了標準光照組件之外,還可以通過定義HDRI地圖來照亮場景。該紋理可以在其場景環(huán)境屬性中為整個View3D設置,也可以在單個材質上設置。
動畫/ Animations
Qt Quick 3D中的動畫使用與Qt Quick相同的動畫系統。您可以將任何屬性綁定到animator上,它將按照以往那樣運動和更新。通過QtQuickTimeline模塊,也可以使用基于關鍵幀的動畫。
像組件模型一樣,這是縮小2D和3D場景之間差距的另一個重要步驟,因為這里沒有使用獨立的、可能沖突的動畫系統。
目前不支持rigged animation,但會納入未來的計劃。
如何親自嘗試?
我們的目標是在發(fā)布Qt 5.14的同時,發(fā)布Qt Quick 3D的技術預覽版本。與此同時,可以在Qt 5.12和之后版本上使用。
要獲取代碼,您只需要從以下位置獲取并編譯QtQuick3D模塊:
https://git.qt.io/annichol/qtquick3d
關于工具
我們的目標是可以完全使用Qt Design Studio來建立3D場景。這意味著能夠直觀地布局場景,導入網格、材質和紋理等3D素材,并將這些素材轉換為引擎使用的高性能的運行時格式。
Qt Quick 3D和Qt Design Studio早期的集成演示
將3D場景導入QML組件
Qt Quick 3D也可以通過手動編寫QML代碼來使用。同時我們也有一些獨立的素材轉換工具。過去這些工具還不成熟?,F在可以使用3D素材創(chuàng)建工具(如Blender、Maya或3DS Max)為該實用工具提供素材,它將生成一個代表這個場景的QML組件,以及它使用的所有紋理、網格和材質。目前,該工具支持從以下格式生成場景:
- FBX
- Collada (dae)
- OBJ
- Blender (blend)
- GLTF2
要轉換文件myTestScene.fbx,您需要運行:
./balsam -o ~/exportDirectory myTestScene.fbx這將生成一個名為MyTestScene.qml的文件以及所有需要的素材。然后,您可以像場景中的任何其他組件一樣使用它:
import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick3D 1.0Window {width: 1920height: 1080visible: truecolor: "black"Node {id: sceneRootLight {}Camera {z: -100}MyTestScene {}}View3D {anchors.fill: parentscene: sceneRoot}}我們正在努力改進該工具生成的素材,希望在未來幾個月內實現改進。
轉換Qt 3D Studio項目
除了能夠從3D素材創(chuàng)建工具生成3D QML組件,我們還為素材導入工具創(chuàng)建了插件,用于轉換現有的Qt 3D Studio項目。如果您以前使用過Qt 3D Studio,您應該知道它會以XML格式生成項目來定義場景。如果您給該工具一個由Qt 3D Studio生成的UIP或UIA項目,它也將在此基礎上生成一個Qt Quick 3D項目。但是請注意,由于Qt 3D Studio使用的運行時不同于Qt Quick 3D,并非所有內容都將被轉換。盡管如此,它應該為轉換現有項目提供了一個很好的起點。我們希望繼續(xù)改善對這種方法的支持,以使現有的Qt 3D Studio用戶順利過渡。
使用Qt Quick 3D導入工具移植的Qt 3D Studio示例應用程序。(它還不完美)
關于Qt 3D
我估計聽到的第一個問題是為什么不直接使用Qt 3D?這也是我們過去幾年一直在探索的問題。
一個自然的假設是,如果我們想混合2D和3D,我們可以在Qt 3D的基礎上構建所有的Qt Quick。我們本來也是這么想的,而且在Qt 3D Studio 2.3版本中這樣做。Qt 3D作為一個很強大的3D引擎在Qt Quick和Qt 3D Studio中被使用。但是,Qt 3D的架構使得我們很難在入門級嵌入式硬件上獲得所需的性能。Qt 3D也有一定的開銷,這來自于自身較慢的運行時,也來自于Qt Quick和圖形硬件之間的另一個抽象層。就目前的形式而言,如果我們想要在確保對從低端到高端的各種平臺和設備持續(xù)提供良好支持的同時,實現完全統一的圖形技術,Qt 3D并不是理想的構建基礎。
與此同時,我們已經在Qt 3D Studio中有了一個渲染引擎,它可以完全滿足我們的需求,是構建額外功能的良好基礎。這樣做的缺點是不再擁有Qt 3D帶來的許多強大API,但是實際上一旦您開始在Qt 3D之上構建一個運行時,您就已經決定了在能力有限的定制框架上的工作方式。最后,最實際的決定是使用現有的Qt 3D Studio渲染引擎作為我們的基礎,并以此為基礎進行構建。
未來的計劃是什么?
本文只是未來的概覽。計劃是將Qt Quick 3D作為一個完整的模塊在Qt 5.15 LTS版本中提供?,F在我們正在進一步開發(fā)Qt Quick 3D,并將在Qt 5.14中作為技術預覽版發(fā)布。
對于Qt 5系列,由于二進制兼容性的承諾,我們限制了2D和3D的結合深度。隨著Qt 6的發(fā)布,我們計劃將Qt Quick 3D更深入地集成到Qt Quick中,以提供更流暢的體驗。
我們的目標是,希望能夠盡可能高效地混合2D和3D內容,而不會給不使用3D內容的用戶帶來任何額外開銷。我們不會做任何極端的事情,比如強迫所有Qt Quick應用程序使用新的渲染器,只有那些混合了2D和3D的應用程序才需要。
在Qt 6中,我們還將使用QtRHI來渲染Qt Quick (包括3D)場景,這將消除我們目前在部署OpenGL應用程序時遇到的許多問題(通過在窗口上使用DirectX,在macOS上使用Metal等等)。
我們還希望最終用戶能夠使用我們創(chuàng)建的更通用的C++渲染API,而不僅是Qt Quick。代碼現在作為私有應用程序接口存在,但是我們要等到Qt 6的時候(RHI移植)之后,才能做出API的兼容性承諾。
非常期待您的反饋!
這是一個技術預覽,您現在看到的很多東西都有可能會發(fā)生改變。例如,現在的API有些粗糙,所以我們想知道我們遺漏了什么,哪些是毫無意義的,哪些是有效的,哪些是無效的。提供這種反饋的最佳方式是通過Qt Bug Tracker。記得在提交問題或者建議時使用Qt Quick:3D標簽。
總結
以上是生活随笔為你收集整理的Qt Quick 3D介绍:Qt Quick的高级3D API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab导入示波器multisim,
- 下一篇: 期刊论文和会议论文的区分与识别