Avec Qt 5.5, le module Canvas3D sort de sa période d’incubation. Il se propose comme un équivalent à WebGL à l’intérieur de Qt Quick (donc accessible en JavaScript depuis une interface QML), en tant qu’API 3D de bas niveau inspirée d’OpenGL. L’objectif est de faciliter le portage d’applications depuis WebGL vers Qt Quick — voire de partager du code entre les deux.
La compatibilité avec WebGL n’est pas encore parfaite, la différence principale étant que WebGL est défini pour des pages HTML. Les écarts par rapport à la norme sont corrigés au fur et à mesure de leur détection ; la conformité complète ne sera pas forcément atteinte, à cause de la forte dépendance de WebGL envers le modèle de données de HTML, inexistant dans Qt Quick. Ceci n’empêche pas le portage facile ou le partage de code entre des applications WebGL-HTML et Qt Quick.
En même temps, l’API de Canvas3D s’inspire fortement de QOpenGLWidget, la manière actuellement conseillée d’intégrer de la 3D dans des applications Qt en C++. Par exemple, le code suivant peint l’écran avec une couleur aléatoire.
Canvas3D {
id: canvas3d
anchors.fill: parent
focus: true
property var gl
onInitializeGL: {
gl = canvas3d.getContext("experimental-webgl");
// Setup clear color to be a random color
gl.clearColor(Math.random(), Math.random(), Math.random(), 1.0);
// Setup viewport
gl.viewport(0, 0, canvas3d.width * canvas3d.devicePixelRatio, canvas3d.height * canvas3d.devicePixelRatio);
}
onPaintGL: {
// Clear background to current clear color
gl.clear(gl.COLOR_BUFFER_BIT);
}
onResizeGL: {
var pixelRatio = canvas3d.devicePixelRatio;
canvas3d.pixelSize = Qt.size(canvas3d.width * pixelRatio, canvas3d.height * pixelRatio);
if (gl)
gl.viewport(0, 0, canvas3d.width * canvas3d.devicePixelRatio, canvas3d.height * canvas3d.devicePixelRatio);
}
}
Tout comme WebGL, Canvas3D est de très bas niveau. Pour débuter, il peut être préférable d’utiliser une couche d’abstraction comme three.js : la version WebGL a été portée vers Canvas3D, avec une série d’exemples et d’utilitaires couramment utilisés. Par exemple, une application 3D de visualisation d’une voiture a pu être portée de WebGL vers Canvas3D en quelques jours.
Ce nouveau module arrive en même temps que les premières préversions de Qt 3D 2.0. Ces deux modules, bien qu’ils aient le même objectif — ajouter du contenu 3D dans une application Qt Quick —, recouvrent des besoins différents : Qt Canvas3D est une API de bas niveau, tandis que Qt 3D est beaucoup plus proche du moteur 3D, avec un graphe de trame complet (une description orientée données de la scène et des transformations à y appliquer lors du rendu). Qt Canvas3D n’est pas accessible en C++, puisque ces fonctionnalités sont d’ores et déjà accessibles par QOpenGLWidget (qui facilite l’utilisation directe d’OpenGL), contrairement à Qt 3D.
Source : Introducing Qt Canvas3D