QQuick3DGeometry Class
Classe de base permettant de définir une géométrie personnalisée. En savoir plus…
| Header: | #include <QQuick3DGeometry> |
| In QML: | Geometry |
| Inherits: | QQuick3DObject |
Fonctions publiques
| void | addAttribute(QQuick3DGeometry::Attribute::Semantic semantic, int offset, QQuick3DGeometry::Attribute::ComponentType componentType) |
| void | addAttribute(const QQuick3DGeometry::Attribute &attribute) |
| void | addSubset(int offset, int count, const QVector3D &boundsMin, const QVector3D &boundsMax, const QString &name = {}) |
(since 6.6) void | addTargetAttribute(quint32 targetId, QQuick3DGeometry::Attribute::Semantic semantic, int offset, int stride = 0) |
(since 6.6) void | addTargetAttribute(const QQuick3DGeometry::TargetAttribute &attribute) |
| QQuick3DGeometry::Attribute | attribute(int index) const |
| int | attributeCount() const |
| QVector3D | boundsMax() const |
| QVector3D | boundsMin() const |
| void | clear() |
| QByteArray | indexData() const |
| QQuick3DGeometry::PrimitiveType | primitiveType() const |
| void | setBounds(const QVector3D &min, const QVector3D &max) |
| void | setIndexData(const QByteArray &data) |
| void | setIndexData(int offset, const QByteArray &data) |
| void | setPrimitiveType(QQuick3DGeometry::PrimitiveType type) |
| void | setStride(int stride) |
(since 6.6) void | setTargetData(const QByteArray &data) |
(since 6.6) void | setTargetData(int offset, const QByteArray &data) |
| void | setVertexData(const QByteArray &data) |
| void | setVertexData(int offset, const QByteArray &data) |
| int | stride() const |
| QVector3D | subsetBoundsMax(int subset) const |
| QVector3D | subsetBoundsMin(int subset) const |
| int | subsetCount() const |
| int | subsetCount(int subset) const |
| QString | subsetName(int subset) const |
| int | subsetOffset(int subset) const |
(since 6.6) QQuick3DGeometry::TargetAttribute | targetAttribute(int index) const |
(since 6.6) int | targetAttributeCount() const |
(since 6.6) QByteArray | targetData() const |
| QByteArray | vertexData() const |
Description détaillée
La classe QQuick3DGeometry permet de spécifier une géométrie personnalisée pour un modèle dans la scène 3D d’ Qt Quick.
Bien que cela ne soit pas strictement nécessaire, l'usage courant consiste à hériter de cette classe. La sous-classe est ensuite exposée à QML en l'enregistrant dans le système de types. La propriété ` geometry ` d'un modèle peut alors être définie pour faire référence à une instance du type enregistré.
La structure générale d’une telle classe est généralement similaire à celle-ci :
class CustomGeometry : public QQuick3DGeometry
{
public:
CustomGeometry() { rebuildGeometry(); }
void setSomething() {
// Change relevant internal data.
// ...
// Then rebuild the vertex and index data and pass it to QQuick3DGeometry.
rebuildGeometry();
// Finally, trigger an update. This is relevant in case nothing else
// is changing in the scene; this way we make sure a new frame will
// be rendered.
update();
}
private:
void rebuildGeometry()
{
QByteArray vertices;
QByteArray indices;
...
setPrimitiveType(Lines);
setVertexBuffer(vertices);
setIndexBuffer(indices);
setStride(3 * sizeof(float)); // e.g. when having 3 components per vertex
setBounds(...); // minimum and maximum extents, for picking
addAttribute(PositionSemantic, 0, F32Type);
...
}
};Cette classe peut ensuite être enregistrée en tant que type QML et utilisée avec ` Model`.
Dans Qt 5, l’enregistrement des types s’effectuait via ` qmlRegisterType` :
qmlRegisterType<CustomGeometry>("Example", 1, 0, "CustomGeometry");Dans Qt 6, l’approche par défaut consiste à utiliser l’enregistrement automatique à l’aide du système de compilation. Au lieu d’appeler ` qmlRegisterType`, le fichier ` .pro ` peut désormais contenir :
CONFIG += qmltypes
QML_IMPORT_NAME = Example
QML_IMPORT_MAJOR_VERSION = 1Avec CMake, l’enregistrement automatique est le comportement par défaut ; aucun paramétrage particulier n’est donc nécessaire au-delà de la configuration de base du module QML :
qt_add_qml_module(application
URI Example
VERSION 1.0
)L'implémentation de la classe doit ajouter ` QML_NAMED_ELEMENT` :
class CustomGeometry : public QQuick3DGeometry
{
Q_OBJECT
QML_NAMED_ELEMENT(CustomGeometry)
...
};Le code QML peut alors utiliser le type personnalisé :
import Example 1.0
Model {
id: customModel
geometry: CustomGeometry {
}
}Au minimum, une géométrie personnalisée doit comporter les éléments suivants :
- les données de sommet,
- le pas entre les sommets,
- le type de primitive,
- un attribut avec PositionSemantic.
Ces éléments suffisent pour le rendu du maillage. Pour le dessin indexé, les données du tampon d'index et un attribut avec `IndexSemantic` doivent également être spécifiés. Afin de prendre en charge la sélection (entrée), la classe doit spécifier le volume englobant à l'aide de ` setBounds()` (). Pour un éclairage correct, un attribut avec `NormalSemantic` est nécessaire. Lorsque le matériau utilise des textures, au moins un jeu de coordonnées UV doit être fourni et décrit dans un attribut `TexCoord0Semantic` ou `TexCoord1Semantic`. Certains matériaux peuvent également nécessiter des tangentes et des binormales.
À titre d’exemple concret et minimal, la classe suivante fournirait la géométrie d’un seul triangle :
class ExampleGeometry : public QQuick3DGeometry
{
Q_OBJECT
QML_NAMED_ELEMENT(ExampleGeometry)
public:
ExampleGeometry();
private:
void updateData();
};
ExampleGeometry::ExampleGeometry()
{
updateData();
}
void ExampleGeometry::updateData()
{
QByteArray v;
v.resize(3 * 3 * sizeof(float));
float *p = reinterpret_cast<float *>(v.data());
// a triangle, front face = counter-clockwise
*p++ = -1.0f; *p++ = -1.0f; *p++ = 0.0f;
*p++ = 1.0f; *p++ = -1.0f; *p++ = 0.0f;
*p++ = 0.0f; *p++ = 1.0f; *p++ = 0.0f;
setVertexData(v);
setStride(3 * sizeof(float));
setPrimitiveType(QQuick3DGeometry::PrimitiveType::Triangles);
addAttribute(QQuick3DGeometry::Attribute::PositionSemantic,
0,
QQuick3DGeometry::Attribute::F32Type);
}En fonction de l’éclairage de la scène, le résultat de la référence à cette géométrie depuis un Model :

Remarque : les donnéesde sommets doivent respecter les conventions OpenGL. Cela signifie que les données doivent être fournies en partant du principe que l’axe Y est orienté vers le haut dans le système de coordonnées normalisé du périphérique, et que les faces avant présentent un sens d’enroulement antihoraire.
Voir également Model et Geometry.
Documentation des fonctions membres
void QQuick3DGeometry::addAttribute(QQuick3DGeometry::Attribute::Semantic semantic, int offset, QQuick3DGeometry::Attribute::ComponentType componentType)
Ajoute la description d'un attribut de sommet. Chaque attribut comporte une « semantic » (définition de l'attribut), qui précise l'utilisation de l'attribut et le nombre de composants qu'il comporte, une « offset » (définition de la position de l'attribut) indiquant le chemin depuis le début jusqu'au sommet et l'emplacement de l'attribut à l'intérieur d'un sommet, ainsi qu'une « componentType » (définition de la structure de l'attribut) précisant le type de données et la taille de l'attribut.
La sémantique peut être l'une des suivantes :
| Constante | Description |
|---|---|
PositionSemantic | L’attribut est une position. 3 composantes : x, y et z |
NormalSemantic | L’attribut est un vecteur normal. 3 composantes : x, y et z |
TexCoord0Semantic | L’attribut est une coordonnée de texture. 2 composantes : u et v |
TexCoord1Semantic | L'attribut est une coordonnée de texture. 2 composantes : u et v |
TangentSemantic | L'attribut est un vecteur tangent. 3 composantes : x, y et z |
BinormalSemantic | L'attribut est un vecteur binormal. 3 composantes : x, y et z |
JointSemantic | L'attribut est un vecteur d'index d'articulation pour le skinning. 4 composantes : index d'articulation 1 à 4 |
WeightSemantic | L'attribut est un vecteur de pondération pour le skinning. 4 composantes : pondération des articulations 1 à 4 |
ColorSemantic | L'attribut est un vecteur de couleur de sommet. 4 composantes : r, g, b et a |
TargetPositionSemantic | L'attribut correspond à la position de la première cible de morphing. 3 composantes : x, y et z |
TargetNormalSemantic | L'attribut est un vecteur normal pour la première cible de morph. 3 composantes : x, y et z |
TargetTangentSemantic | Cet attribut est un vecteur tangent pour la première cible de morph. 3 composantes : x, y et z |
TargetBinormalSemantic | L'attribut est un vecteur binormal pour la première cible de morph. 3 composantes : x, y et z |
De plus, l’attribut « semantic » peut prendre la valeur « IndexSemantic ». Dans ce cas, l’attribut ne représente pas une entrée dans le tampon de sommets, mais décrit plutôt les données d’index dans le tampon d’index. Comme il n’y a toujours qu’un seul index par sommet, l’attribut « offset » n’a pas de sens pour le tampon d’index et doit être laissé à zéro.
Le type de composant peut être l’un des suivants :
| Constante | Description |
|---|---|
U16Type | Le type de composante d'index est un entier non signé de 16 bits. Pris en charge uniquement pour IndexSemantic. |
U32Type | L’attribut (ou composante d’index) est un entier non signé de 32 bits. |
I32Type | L’attribut est un entier signé de 32 bits. Attention : les anciennes versions d’OpenGL (telles que la version 2.1 ou OpenGL ES 2.0) peuvent ne pas prendre en charge ce type de données. |
F32Type | L'attribut est un nombre à virgule flottante en simple précision. Remarque : les données d’index de joint sont généralement de type « Remarque : pour les données d’index ( Remarque : TargetXXXSemantics sera obsolète. addTargetAttribute peut être utilisé pour les cibles de morphing. À l’heure actuelle, ces sémantiques ne sont prises en charge que pour des raisons de compatibilité ascendante. Si elles sont utilisées conjointement avec addTargetAttribute et setTargetData, le résultat ne peut être garanti. |
void QQuick3DGeometry::addAttribute(const QQuick3DGeometry::Attribute &attribute)
Ajoute la description d'un attribut de sommet. Chaque attribut possède une sémantique, qui précise son utilisation et le nombre de composants qu'il comporte, un décalage entre le début du sommet et l'emplacement de l'attribut à l'intérieur de celui-ci, ainsi qu'un « componentType » indiquant le type de données et la taille de l'attribut.
Il s'agit d'une fonction surchargée.
void QQuick3DGeometry::addSubset(int offset, int count, const QVector3D &boundsMin, const QVector3D &boundsMax, const QString &name = {})
Ajoute un nouveau sous-ensemble à la géométrie. Les sous-ensembles permettent de rendre certaines parties de la géométrie avec des matériaux différents. Les matériaux sont spécifiés dans les fichiers model.
Si la géométrie dispose d’un tampon d’index, alors les paramètres ` offset ` et ` count ` correspondent respectivement au décalage de la primitive et au nombre d’index dans le sous-ensemble. Si la géométrie ne dispose que d’un tampon de sommets, le décalage correspond au décalage des sommets et le nombre d’index correspond au nombre de sommets dans le sous-ensemble.
Les limites boundsMin et boundsMax doivent englober le sous-ensemble, tout comme les limites de la géométrie. Le sous-ensemble peut également disposer d’une name.
[since 6.6] void QQuick3DGeometry::addTargetAttribute(quint32 targetId, QQuick3DGeometry::Attribute::Semantic semantic, int offset, int stride = 0)
Ajoute la description de l'attribut de cible de morphing. Chaque attribut comporte une « targetId » (cible de morphing) à laquelle il appartient, une « semantic » (définition de l'attribut) qui précise l'utilisation de l'attribut et le nombre de composants qu'il comporte, une « offset » (distance de l'attribut) allant du début au sommet jusqu'à l'emplacement de l'attribut à l'intérieur d'un sommet, ainsi qu'une « stride » (espacement) qui correspond à la taille en octets entre les éléments.
Remarque : le ` targetId` doit croître à partir de 0 sans sauter aucun numéro, et toutes les cibles doivent posséder les mêmes attributs.
Remarque : la sémantique est la même que celle de l’attribut de sommet, mais les valeurs IndexSemantic, JointSemantic et WeightSemantic ne sont pas autorisées pour les attributs de cible.
Remarque : les « componentTypes » de tous les attributs cibles doivent être de type « F32Type ».
Remarque : si la pas n’est pas spécifiée ou si elle est inférieure ou égale à zéro, l’attribut est considéré comme étant « tightly packed ».
Cette fonction a été introduite dans Qt 6.6.
Voir également addAttribute.
[since 6.6] void QQuick3DGeometry::addTargetAttribute(const QQuick3DGeometry::TargetAttribute &attribute)
Ajoute la description des attributs de cible de morphing. Chaque attribut possède un `targetId` auquel il appartient, une `semantic` qui précise son utilisation et le nombre de composants qu’il comporte, un `offset` indiquant la distance entre le début du sommet et l’emplacement de l’attribut à l’intérieur de ce sommet, ainsi qu’un `stride` correspondant à la taille en octets entre les éléments.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.6.
QQuick3DGeometry::Attribute QQuick3DGeometry::attribute(int index) const
Renvoie le numéro de définition de l'attribut index
Les définitions d'attributs sont numérotées de 0 à attributeCount() - 1
int QQuick3DGeometry::attributeCount() const
Renvoie le nombre d'attributs définis pour cette géométrie.
Voir également attribute.
QVector3D QQuick3DGeometry::boundsMax() const
Renvoie la coordonnée maximale du volume englobant.
Voir aussi setBounds.
QVector3D QQuick3DGeometry::boundsMin() const
Renvoie la coordonnée minimale du volume englobant.
Voir également setBounds.
void QQuick3DGeometry::clear()
Rétablit la géométrie dans son état initial, en effaçant les données de sommets et d'indices précédemment définies, ainsi que les attributs.
QByteArray QQuick3DGeometry::indexData() const
Renvoie les données du tampon d'index.
Voir également setIndexData().
QQuick3DGeometry::PrimitiveType QQuick3DGeometry::primitiveType() const
Renvoie le type primitif utilisé lors du rendu. La valeur par défaut est « Triangles ».
Voir également setPrimitiveType.
void QQuick3DGeometry::setBounds(const QVector3D &min, const QVector3D &max)
Définit le volume englobant de la géométrie comme étant le cube défini par les points min et max. Cette fonction est utilisée pour la commande « picking ».
void QQuick3DGeometry::setIndexData(const QByteArray &data)
Définit le tampon d'index sur data. Pour utiliser le dessin indexé, ajoutez un attribut avec IndexSemantic
Voir également indexData() et addAttribute.
void QQuick3DGeometry::setIndexData(int offset, const QByteArray &data)
Met à jour un sous-ensemble du tampon d’index. ` offset ` spécifie le décalage en octets, tandis que ` data ` spécifie la taille et les données.
Cette fonction ne redimensionne pas le tampon. Si offset + data.size() est supérieur à la taille actuelle du tampon, les données excédentaires seront ignorées.
Remarque : les fonctions de mise à jour partielle des données de sommets, d’index et de cibles de morphing n’offrent aucune garantie quant à la manière dont ces modifications sont mises en œuvre en interne. Selon l’implémentation sous-jacente, même des modifications partielles peuvent entraîner la mise à jour de l’intégralité de la ressource graphique.
Il s’agit d’une fonction surchargée.
void QQuick3DGeometry::setPrimitiveType(QQuick3DGeometry::PrimitiveType type)
Définit le type primitif utilisé pour le rendu sur « type ».
| Constante | Description |
|---|---|
Points | Les primitives sont des points. |
LineStrip | Les primitives sont des lignes dans une bande. |
Lines | Les primitives sont des lignes dans une liste. |
TriangleStrip | Les primitives sont des triangles dans une bande. |
TriangleFan | Les primitives sont des triangles disposés en éventail. Attention : les éventails de triangles peuvent ne pas être pris en charge lors de l'exécution, selon l'API graphique sous-jacente. |
Triangles | Les primitives sont des triangles dans une liste. |
La valeur initiale est Triangles.
Remarque : notez que les éventails de triangles (TriangleFan) peuvent ne pas être pris en charge lors de l'exécution, selon l'API graphique sous-jacente. Par exemple, avec Direct 3D, cette topologie ne fonctionnera pas du tout.
Remarque : la taille des points pour Points et l'épaisseur des lignes pour Lines et LineStrip sont contrôlées par material. Notez toutefois que les valeurs différentes de 1 peuvent ne pas être prises en charge lors de l'exécution, selon l'API graphique sous-jacente.
Voir également primitiveType().
void QQuick3DGeometry::setStride(int stride)
Définit la taille de pas du tampon de sommets à stride, exprimée en octets. Il s'agit de la distance entre deux sommets consécutifs dans le tampon.
Par exemple, un tampon de sommets étroitement compacté et entrelacé pour une géométrie utilisant PositionSemantic, IndexSemantic et ColorSemantic aura un pas de 28 (sept flottants au total : trois pour la position, quatre pour la couleur et aucun pour les index, qui ne figurent pas dans le tampon de sommets).
Remarque : la fonction ` QQuick3DGeometry ` attend des données de sommets présentant une disposition d’attributs entrelacée et ne fonctionne qu’avec ce type de données.
Voir également stride() et addAttribute.
[since 6.6] void QQuick3DGeometry::setTargetData(const QByteArray &data)
Définit la mémoire tampon de la cible de morphing data. Cette mémoire tampon doit contenir toutes les données de la cible de morphing.
Cette fonction a été introduite dans Qt 6.6.
Voir également targetData() et addTargetAttribute.
[since 6.6] void QQuick3DGeometry::setTargetData(int offset, const QByteArray &data)
Met à jour un sous-ensemble du tampon de cible de morphing. ` offset ` spécifie le décalage en octets, tandis que ` data ` spécifie la taille et les données.
Cette fonction ne redimensionne pas le tampon. Si offset + data.size() est supérieure à la taille actuelle du tampon, les données excédentaires seront ignorées.
Remarque : les fonctions de mise à jour partielle des données de sommets, d’index et de cibles de morphing n’offrent aucune garantie quant à la manière dont ces modifications sont mises en œuvre en interne. Selon l’implémentation sous-jacente, même des modifications partielles peuvent entraîner la mise à jour de l’intégralité de la ressource graphique.
Il s’agit d’une fonction surchargée.
Cette fonction a été introduite dans Qt 6.6.
void QQuick3DGeometry::setVertexData(const QByteArray &data)
Définit le tampon de sommets data. Ce tampon doit contenir toutes les données de sommets regroupées dans le tableau, conformément aux définitions des attributs. Notez que cela n'inclut pas les attributs avec l'IndexSemantic, qui doivent figurer dans le tampon d'index.
Voir également vertexData(), addAttribute, setStride et setIndexData.
void QQuick3DGeometry::setVertexData(int offset, const QByteArray &data)
Met à jour un sous-ensemble du tampon de sommets. ` offset ` spécifie le décalage en octets, tandis que ` data ` spécifie la taille et les données.
Cette fonction ne redimensionne pas le tampon. Si offset + data.size() est supérieure à la taille actuelle du tampon, les données excédentaires seront ignorées.
Remarque : les fonctions de mise à jour partielle des données de sommets, d’index et de cibles de morphing n’offrent aucune garantie quant à la manière dont ces modifications sont mises en œuvre en interne. Selon l’implémentation sous-jacente, même des modifications partielles peuvent entraîner la mise à jour de l’intégralité de la ressource graphique.
Il s’agit d’une fonction surchargée.
int QQuick3DGeometry::stride() const
Renvoie la longueur en octets du tampon de sommets.
Voir également setStride.
QVector3D QQuick3DGeometry::subsetBoundsMax(int subset) const
Renvoie le nombre maximal de limites d'un objet de type ` subset`.
Voir aussi subsetBoundsMin.
QVector3D QQuick3DGeometry::subsetBoundsMin(int subset) const
Renvoie le nombre de limites minimales d'un objet de type ` subset`.
Voir aussi subsetBoundsMax.
int QQuick3DGeometry::subsetCount() const
Renvoie le nombre de sous-ensembles.
int QQuick3DGeometry::subsetCount(int subset) const
Renvoie le nombre de primitives du sous-ensemble.
Voir également subsetOffset.
QString QQuick3DGeometry::subsetName(int subset) const
Renvoie le nom de l'subset.
int QQuick3DGeometry::subsetOffset(int subset) const
Renvoie l'offset de l'subset e vers le tampon de sommets ou d'indices.
Voir aussi subsetCount.
[since 6.6] QQuick3DGeometry::TargetAttribute QQuick3DGeometry::targetAttribute(int index) const
Renvoie le numéro de définition de l'attribut « morph target » index
Les définitions d'attributs sont numérotées de 0 à attributeCount() - 1
Cette fonction a été introduite dans Qt 6.6.
[since 6.6] int QQuick3DGeometry::targetAttributeCount() const
Renvoie le nombre d'attributs de cible de morphing définis pour cette géométrie.
Cette fonction a été introduite dans Qt 6.6.
Voir aussi targetAttribute.
[since 6.6] QByteArray QQuick3DGeometry::targetData() const
Renvoie les données du tampon cible définies par ` setTargetData`.
Cette fonction a été introduite dans Qt 6.6.
Voir également ` setTargetData()`.
QByteArray QQuick3DGeometry::vertexData() const
Renvoie les données du tampon de sommets définies par ` setVertexData`.
Voir également setVertexData().
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.