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