日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 充電吧
[導(dǎo)讀]Qt Canvas 3D是Qt 基于WebGL的3D內(nèi)容運行環(huán)境。由于QtQuick本身就是通過類js引擎執(zhí)行,而且渲染層面基于opengl技術(shù)。故結(jié)合webgL和Qtquick的優(yōu)勢,利用js高效的

Qt Canvas 3D是Qt 基于WebGL的3D內(nèi)容運行環(huán)境。由于QtQuick本身就是通過類js引擎執(zhí)行,而且渲染層面基于opengl技術(shù)。故結(jié)合webgL和Qtquick的優(yōu)勢,利用js高效的特點,給Qtquick增加了3d功能。而且Qt Canvas 3D還可以利用成熟的web 3d框架,如three.js、gl-matrix.js等,大大方便了利用QtQuick編寫3d內(nèi)容。Qt Canvas 3D是由官方支持,比Qt3D模塊較成熟。至于兩者性能上的差異尚待對比。


最新版QtCreater支持在創(chuàng)建項目時指定Qt Canvas 3D應(yīng)用,下面我們通過該方式創(chuàng)建一個默認應(yīng)用,學(xué)習(xí)其結(jié)構(gòu)組成。通過QtCreater創(chuàng)建一個使用three.js的應(yīng)用。


main.cpp

#include?#include?int?main(int?argc,?char?*argv[])
{
????QGuiApplication?app(argc,?argv);

????QQmlApplicationEngine?engine;
????engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

????return?app.exec();
}


從上面可以看出,Canvas 3D應(yīng)用和普通qml應(yīng)用對于c++后端要求一致,沒有額外內(nèi)容,由下面qml代碼可知,Canvas3D即一個普通的QtQuick Item。

main.qml

import?QtQuick?2.4
import?QtCanvas3D?1.0
import?QtQuick.Window?2.2

import?"glcode.js"?as?GLCode

Window?{
????title:?qsTr("untitled1")
????width:?1280
????height:?768
????visible:?true

????Canvas3D?{
????????id:?canvas3d
????????anchors.fill:?parent
????????focus:?true

????????onInitializeGL:?{
????????????GLCode.initializeGL(canvas3d);
????????}

????????onPaintGL:?{
????????????GLCode.paintGL(canvas3d);
????????}

????????onResizeGL:?{
????????????GLCode.resizeGL(canvas3d);
????????}
????}
}

上述代碼通過Canvas3D元素定義了3d場景,當(dāng)場景初始化后會發(fā)送?initializeGL 信號,從而執(zhí)on?initializeGL 槽。實際的控制邏輯寫在了glcode.js中,通過槽函數(shù)將要操作的場景對象canvas3d傳給js代碼。

glcode.js首先導(dǎo)入three.js,然后實現(xiàn)了main.qml中對應(yīng)的3個槽對應(yīng)的函數(shù)功能。其語法和普通的three.js應(yīng)用區(qū)別不大,故一個基于html的three.js應(yīng)用可以很方便的移植到QtQuick中。


The?Canvas3D?is a QML element that, when placed in your Qt Quick 2 scene, allows you to get a 3D rendering context and call 3D rendering API calls through that context object. Use of the rendering API requires knowledge of OpenGL-like rendering APIs.

There are two functions that are called by the?Canvas3D?implementation:

initializeGL?is emitted before the first frame is rendered, and usually during that you get the 3D context and initialize resources to be used later on during the rendering cycle.

paintGL?is emitted for each frame to be rendered, and usually during that you submit 3D rendering calls to draw whatever 3D content you want to be displayed.

邏輯代碼

Qt.include("three.js")

var?camera,?scene,?renderer;
var?cube;

function?initializeGL(canvas)?{
????scene?=?new?THREE.Scene();
????//custom?begain
????camera?=?new?THREE.PerspectiveCamera(75,?canvas.width?/?canvas.height,?0.1,?1000);
????camera.position.z?=?5;

????var?material?=?new?THREE.MeshBasicMaterial({?color:?0x80c342,
???????????????????????????????????????????????????ambient:?0x000000,
???????????????????????????????????????????????????shading:?THREE.SmoothShading?});
????var?cubeGeometry?=?new?THREE.BoxGeometry(1,?1,?1);
????cube?=?new?THREE.Mesh(cubeGeometry,?material);
????cube.rotation.set(0.785,?0.785,?0.0);
????scene.add(cube);

????//custom?end
????renderer?=?new?THREE.Canvas3DRenderer(
????????????????{?canvas:?canvas,?antialias:?true,?devicePixelRatio:?canvas.devicePixelRatio?});
????renderer.setSize(canvas.width,?canvas.height);
}

function?resizeGL(canvas)?{
????camera.aspect?=?canvas.width?/?canvas.height;
????camera.updateProjectionMatrix();

????renderer.setPixelRatio(canvas.devicePixelRatio);
????renderer.setSize(canvas.width,?canvas.height);
}

function?paintGL(canvas)?{
????renderer.render(scene,?camera);
}

從上述js代碼可以看出,resizeGL和paintGL一般默認即可,不需要改動,需要我們編寫的是initializeGL中//custom begain 和//custom end 之間的內(nèi)容。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

Qt是一款由Qt公司(前身為Trolltech)開發(fā)的跨平臺應(yīng)用程序框架。它提供了豐富的功能,包括圖形用戶界面、數(shù)據(jù)庫操作、網(wǎng)絡(luò)通信等,使得開發(fā)者能夠更加便捷地創(chuàng)建高質(zhì)量、可移植性強的應(yīng)用程序。Qt采用C++編寫,同時也...

關(guān)鍵字: QT RTOS

近日,蘋果公司在近日公開“用于在 2D 屏幕上操縱 3D 對象的設(shè)備、方法和圖形用戶界面”專利,公開號為 CN113728301A。

關(guān)鍵字: 蘋果 2D 3d 屏幕

摘 要 :為解決制鞋行業(yè)中噴膠精度不高、靈活性差、生產(chǎn)效率低的問題,設(shè)計一種基于機器視覺的鞋模噴膠系統(tǒng)。該系統(tǒng)硬件由工業(yè)攝像頭、工控機及路由器構(gòu)成,軟件則采用圖像識別庫 OpenCV 與圖形界面應(yīng)用程序開發(fā)框架 Qt 編...

關(guān)鍵字: 機器視覺 圖像處理 鞋模 噴膠 OpenCV QT

嵌入式系統(tǒng)是指以應(yīng)用為中心、以計算機技術(shù)為基礎(chǔ),軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計算機系統(tǒng)。

關(guān)鍵字: QT 嵌入式 C++

摘 要:倉儲作為物流與供應(yīng)鏈的核心環(huán)節(jié),對食品安全的控制起著至關(guān)重要的作用。溫濕度是影響糧食倉儲過程安全與品質(zhì)的重要因素。文中使用無線傳感網(wǎng)絡(luò)進行數(shù)據(jù)采集,通過Qt平臺設(shè)計軟件系統(tǒng),并借助數(shù)據(jù)庫進行數(shù)據(jù)存儲與分析處理,實...

關(guān)鍵字: 成品糧 倉儲 溫濕度監(jiān)測 無線傳感網(wǎng)絡(luò) QT

在此部件上繪制行號,并將其放置在CodeEditor的viewport()的左邊距區(qū)域上,QWidget類也可以幫助我們對其內(nèi)容進行滾動。

關(guān)鍵字: QT 代碼編輯器

不管是Qt新手還是開發(fā)過qt的群體來說,對Qt Designer、Qt Quick Designer、Qt Creator這幾個應(yīng)用程序肯定是熟悉的。

關(guān)鍵字: QT IDE C

在當(dāng)今社會,人們的生活水平普遍提高,工作強度越來越大,營養(yǎng)的過剩和運動量的減少,導(dǎo)致心腦血管疾病的發(fā)病率是越來越高。

關(guān)鍵字: Linux QT GPRS 遠程集群式 心臟病人實時診斷系

qt值得學(xué)習(xí)嗎? 嵌入式要學(xué)的東西真的很多,我們可能會說不寫界面的話就不用學(xué)qt了?我不贊同。

關(guān)鍵字: 嵌入式 QT UI

什么是qt?簡單點說,Qt 就是一個跨平臺的 C++ 圖形用戶界面庫,可以同時支持桌面應(yīng)用程序開發(fā)、嵌入式開發(fā)和移動開發(fā),覆蓋了現(xiàn)有的所有主流平臺。

關(guān)鍵字: QT 程序 開發(fā)
關(guān)閉