Sur cette page

QQuick3DGeometry Class

Classe de base permettant de définir une géométrie personnalisée. Plus d'informations...

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 peut être utilisée pour spécifier une géométrie personnalisée pour un modèle dans la scène 3D de Qt Quick.

Bien que cela ne soit pas strictement nécessaire, l'utilisation typique est d'hériter de cette classe. La sous-classe est alors 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 référencer une instance du type enregistré.

La structure de haut niveau d'une telle classe est typiquement similaire à ce qui suit :

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'effectue à l'aide de qmlRegisterType:

qmlRegisterType<CustomGeometry>("Example", 1, 0, "CustomGeometry");

Dans Qt 6, l'approche par défaut consiste à utiliser l'enregistrement automatique avec l'aide du système de construction. Au lieu d'appeler qmlRegisterType, le fichier .pro peut maintenant contenir :

CONFIG += qmltypes
QML_IMPORT_NAME = Example
QML_IMPORT_MAJOR_VERSION = 1

Avec CMake, l'enregistrement automatique est le comportement par défaut, de sorte qu'aucun paramètre spécial n'est 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 :

  • données de vertex,
  • stride du vertex,
  • type primitif,
  • un attribut avec PositionSemantic.

Ces éléments sont suffisants pour effectuer 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 le prélèvement (entrée), la classe doit spécifier le volume de délimitation à l'aide de setBounds(). Pour un éclairage correct, un attribut avec NormalSemantic est nécessaire. Lorsque le matériau utilise la texturation, 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 fournit 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 du référencement de cette géométrie à partir d'un modèle :

Triangle noir sur fond gris indiquant une géométrie personnalisée

Remarque : les données relatives aux sommets doivent respecter les conventions OpenGL. Cela signifie que les données doivent être fournies en supposant que l'axe Y pointe vers le haut dans le système de coordonnées normalisé de l'appareil et que les faces avant ont un enroulement dans le sens inverse des aiguilles d'une montre.

Voir aussi Model et Geometry.

Documentation des fonctions membres

void QQuick3DGeometry::addAttribute(QQuick3DGeometry::Attribute::Semantic semantic, int offset, QQuick3DGeometry::Attribute::ComponentType componentType)

Ajout d'une description des attributs des sommets. Chaque attribut a un semantic, qui spécifie l'utilisation de l'attribut et le nombre de composants qu'il possède, un offset du début au sommet jusqu'à l'emplacement de l'attribut à l'intérieur d'un sommet et un componentType spécifiant le type de données et la taille de l'attribut.

La sémantique peut être l'une des suivantes :

ConstanteDescription de l'attribut
PositionSemanticL'attribut est une position. 3 composantes : x, y et z
NormalSemanticL'attribut est un vecteur normal. 3 composantes : x, y et z
TexCoord0SemanticL'attribut est une coordonnée de texture. 2 composantes : u et v
TexCoord1SemanticL'attribut est une coordonnée de texture. 2 composantes : u et v
TangentSemanticL'attribut est un vecteur tangent. 3 composantes : x, y et z
BinormalSemanticL'attribut est un vecteur binormal. 3 composantes : x, y et z
JointSemanticL'attribut est un vecteur d'index commun pour l'écorchage. 4 composantes : indice commun 1-4
WeightSemanticL'attribut est un vecteur de poids pour l'écorchage. 4 composantes : poids commun 1-4
ColorSemanticL'attribut est un vecteur de couleur de sommet. 4 composantes : r, g, b et a
TargetPositionSemanticL'attribut est une position pour la première cible de morphing. 3 composantes : x, y et z
TargetNormalSemanticL'attribut est un vecteur normal pour la première cible de morphing. 3 composantes : x, y et z
TargetTangentSemanticL'attribut est un vecteur tangent pour la première cible morph. 3 composantes : x, y et z
TargetBinormalSemanticL'attribut est un vecteur binormal pour la première cible morph. 3 composantes : x, y et z

En outre, semantic peut être IndexSemantic. Dans ce cas, l'attribut ne représente pas une entrée dans le tampon de vertex, mais décrit plutôt les données d'index dans le tampon d'index. Étant donné qu'il n'y a toujours qu'un seul index par sommet, offset n'a aucun sens pour le tampon d'index et doit être laissé à zéro.

Le type de composant peut être l'un des suivants :

ConstanteDescription
U16TypeLe type de composant d'index est un entier non signé de 16 bits. Pris en charge uniquement pour IndexSemantic.
U32TypeL'attribut (ou le composant d'index) est un entier non signé de 32 bits.
I32TypeL'attribut est un entier 32 bits signé. Attention, les anciennes versions d'OpenGL (telles que 2.1 ou OpenGL ES 2.0) peuvent ne pas supporter ce type de données.
F32TypeL'attribut est un flottant simple précision.

Remarque : les données d'index de l'articulation sont généralement I32Type. F32Type est également pris en charge pour permettre le fonctionnement des API, telles que OpenGL ES 2.0, qui ne prennent pas en charge les attributs d'entrée des sommets entiers.

Remarque : pour les données d'index (IndexSemantic), seuls les types U16Type et U32Type sont valables et pris en charge.

Note : TargetXXXSemantics sera déprécié. addTargetAttribute peut être utilisé pour les cibles morph. Ces sémantiques ne sont plus supportées que pour des raisons de compatibilité ascendante. Si elles sont mélangées avec addTargetAttribute et setTargetData, le résultat ne peut être garanti.

void QQuick3DGeometry::addAttribute(const QQuick3DGeometry::Attribute &attribute)

Ajoute une description de l'attribut de sommet. Chaque attribut possède une sémantique, qui spécifie l'utilisation de l'attribut et le nombre de composants qu'il possède, un décalage entre le début du sommet et l'emplacement de l'attribut à l'intérieur du sommet, ainsi qu'un componentType spécifiant 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 des parties de la géométrie avec des matériaux différents. Les matériaux sont spécifiés dans model.

Si la géométrie dispose d'un tampon d'index, les valeurs offset et count sont le décalage de la primitive et le nombre d'index dans le sous-ensemble. Si la géométrie ne dispose que d'un tampon de sommets, le décalage est le décalage de sommets et le nombre est le nombre de sommets dans le sous-ensemble.

Les limites boundsMin et boundsMax doivent entourer le sous-ensemble comme les limites de la géométrie. Le sous-ensemble peut également avoir un name.

[since 6.6] void QQuick3DGeometry::addTargetAttribute(quint32 targetId, QQuick3DGeometry::Attribute::Semantic semantic, int offset, int stride = 0)

Ajoute la description de l'attribut cible morph. Chaque attribut a un targetId auquel l'attribut appartient, un semantic, qui spécifie l'utilisation de l'attribut et le nombre de composants qu'il a, un offset du début au sommet jusqu'à l'emplacement de l'attribut à l'intérieur d'un sommet, et un stride qui est une taille d'octet entre les éléments.

Note : Le targetId doit être augmenté à partir de 0 sans sauter de numéro et toutes les cibles doivent avoir les mêmes attributs.

Note : La sémantique est la même que celle de l'attribut vertex, mais IndexSemantic, JointSementic et WeightSemantic ne sont pas autorisés pour les attributs target.

Remarque : les componentTypes de tous les attributs cibles doivent être des F32Type.

Remarque : Si le stride n'est pas indiqué ou s'il est inférieur ou égal à zéro, l'attribut est considéré comme très compact.

Cette fonction a été introduite dans Qt 6.6.

Voir aussi addAttribute.

[since 6.6] void QQuick3DGeometry::addTargetAttribute(const QQuick3DGeometry::TargetAttribute &attribute)

Ajoute la description d'un attribut cible de morphologie. Chaque attribut a un targetId auquel l'attribut appartient, une sémantique, qui spécifie l'utilisation de l'attribut et le nombre de composants qu'il a, un décalage entre le début du sommet et l'emplacement de l'attribut à l'intérieur d'un sommet, et un stride qui est une taille d'octet 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 la 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 aussi attribute.

QVector3D QQuick3DGeometry::boundsMax() const

Renvoie la coordonnée maximale du volume délimité.

Voir aussi setBounds.

QVector3D QQuick3DGeometry::boundsMin() const

Renvoie la coordonnée minimale du volume délimité.

Voir aussi setBounds.

void QQuick3DGeometry::clear()

Réinitialise la géométrie à son état initial, en effaçant les données de vertex et d'index ainsi que les attributs précédemment définis.

QByteArray QQuick3DGeometry::indexData() const

Renvoie les données du tampon d'index.

Voir aussi setIndexData().

QQuick3DGeometry::PrimitiveType QQuick3DGeometry::primitiveType() const

Renvoie le type de primitive utilisé lors du rendu. La valeur par défaut est Triangles.

Voir aussi setPrimitiveType.

void QQuick3DGeometry::setBounds(const QVector3D &min, const QVector3D &max)

Définit le volume délimité de la géométrie au cube défini par les points min et max. Ceci est utilisé pour picking.

void QQuick3DGeometry::setIndexData(const QByteArray &data)

Définit le tampon d'index à data. Pour utiliser le dessin indexé, ajoutez un attribut avec la mention 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, data spécifie la taille et les données.

Cette fonction ne redimensionne pas la mémoire tampon. Si offset + data.size() est supérieur à la taille actuelle du tampon, les données en dépassement seront ignorées.

Remarque : les fonctions de mise à jour partielle des données relatives aux sommets, aux index et aux cibles morphologiques n'offrent aucune garantie quant à la manière dont ces modifications sont mises en œuvre en interne. En fonction de l'implémentation sous-jacente, même des modifications partielles peuvent entraîner la mise à jour de l'ensemble de la ressource graphique.

Il s'agit d'une fonction surchargée.

void QQuick3DGeometry::setPrimitiveType(QQuick3DGeometry::PrimitiveType type)

Définit le type de primitive utilisé pour le rendu à type.

ConstanteDescription
PointsLes primitives sont des points.
LineStripLes primitives sont des lignes dans une bande.
LinesLes primitives sont des lignes dans une liste.
TriangleStripLes primitives sont des triangles dans une bande.
TriangleFanLes primitives sont des triangles dans un éventail. Sachez que les éventails de triangles peuvent ne pas être pris en charge au moment de l'exécution, en fonction de l'API graphique sous-jacente.
TrianglesLes primitives sont des triangles dans une liste.

La valeur initiale est Triangles.

Remarque : les éventails de triangles (TriangleFan) peuvent ne pas être pris en charge au moment de l'exécution, en fonction de l'API graphique sous-jacente. Par exemple, avec Direct 3D, cette topologie ne sera pas du tout fonctionnelle.

Remarque : la taille des points pour les points et la largeur des lignes pour les lignes et les bandes de lignes sont contrôlées par material. Sachez toutefois que les tailles différentes de 1 peuvent ne pas être prises en charge au moment de l'exécution, en fonction de l'API graphique sous-jacente.

Voir également primitiveType().

void QQuick3DGeometry::setStride(int stride)

Définit le stride du tampon de sommets à stride, mesuré en octets. Il s'agit de la distance entre deux sommets consécutifs dans le tampon.

Par exemple, un tampon de vertex entrelacé et très compact pour une géométrie utilisant PositionSemantic, IndexSemantic, et ColorSemantic aura un stride de 28 (sept flottants au total : trois pour la position, quatre pour la couleur, et aucun pour les index, qui ne vont pas dans le tampon de vertex).

Remarque : QQuick3DGeometry s'attend à des données de vertex avec une disposition d'attributs entrelacés, et ne fonctionne qu'avec ces données.

Voir aussi stride() et addAttribute.

[since 6.6] void QQuick3DGeometry::setTargetData(const QByteArray &data)

Définit le tampon de la cible morphologique data. Le tampon doit contenir toutes les données de la cible morph.

Cette fonction a été introduite dans Qt 6.6.

Voir aussi targetData() et addTargetAttribute.

[since 6.6] void QQuick3DGeometry::setTargetData(int offset, const QByteArray &data)

Met à jour un sous-ensemble du tampon cible morph. offset spécifie le décalage en octets, 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 en dépassement seront ignorées.

Remarque : les fonctions de mise à jour partielle des données relatives aux sommets, aux index et aux cibles morphologiques n'offrent aucune garantie quant à la manière dont ces modifications sont mises en œuvre en interne. En fonction de l'implémentation sous-jacente, même des modifications partielles peuvent entraîner la mise à jour de l'ensemble 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 la mémoire tampon des vertex data. Le tampon doit contenir toutes les données de vertex emballées dans le tableau, comme décrit par les définitions d'attributs. Notez que cela n'inclut pas les attributs avec IndexSemantic, qui appartiennent au tampon d'index.

Voir aussi vertexData(), addAttribute, setStride, et setIndexData.

void QQuick3DGeometry::setVertexData(int offset, const QByteArray &data)

Met à jour un sous-ensemble de la mémoire tampon des vertex. offset spécifie le décalage en octets, data spécifie la taille et les données.

Cette fonction ne redimensionne pas la mémoire tampon. Si offset + data.size() est supérieur à la taille actuelle de la mémoire tampon, les données en dépassement seront ignorées.

Remarque : les fonctions de mise à jour partielle des données relatives aux sommets, aux index et aux cibles morphologiques n'offrent aucune garantie quant à la manière dont ces modifications sont mises en œuvre en interne. En fonction de la mise en œuvre sous-jacente, même des modifications partielles peuvent entraîner la mise à jour de l'ensemble de la ressource graphique.

Il s'agit d'une fonction surchargée.

int QQuick3DGeometry::stride() const

Renvoie le nombre d'octets du tampon de vertex.

Voir aussi setStride.

QVector3D QQuick3DGeometry::subsetBoundsMax(int subset) const

Renvoie le nombre de bornes maximales d'une subset.

Voir aussi subsetBoundsMin.

QVector3D QQuick3DGeometry::subsetBoundsMin(int subset) const

Renvoie le nombre de bornes minimales d'un 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 aussi subsetOffset.

QString QQuick3DGeometry::subsetName(int subset) const

Renvoie le nom de subset.

int QQuick3DGeometry::subsetOffset(int subset) const

Renvoie le décalage subset vers le tampon de vertex ou d'index.

Voir aussi subsetCount.

[since 6.6] QQuick3DGeometry::TargetAttribute QQuick3DGeometry::targetAttribute(int index) const

Renvoie le numéro de la définition de l'attribut cible morph 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 cibles morph 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 aussi setTargetData().

QByteArray QQuick3DGeometry::vertexData() const

Renvoie les données du tampon de vertex définies par setVertexData.

Voir aussi 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.