QQuick3DGeometry Class
Clase base para definir geometría personalizada. Más...
| Header: | #include <QQuick3DGeometry> |
| In QML: | Geometry |
| Inherits: | QQuick3DObject |
Funciones públicas
| 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 |
Descripción Detallada
QQuick3DGeometry puede utilizarse para especificar geometría personalizada para un Modelo en la escena 3D de Qt Quick.
Aunque no es estrictamente necesario, el uso típico es heredar de esta clase. La subclase se expone a QML registrándola en el sistema de tipos. La propiedad geometry de un modelo puede establecerse para hacer referencia a una instancia del tipo registrado.
La estructura de alto nivel de una clase de este tipo suele ser similar a la siguiente:
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); ... } };
Esta clase puede entonces registrarse como un tipo QML y utilizarse con Model.
En Qt 5 el registro de tipos se realizaba con qmlRegisterType:
qmlRegisterType<CustomGeometry>("Example", 1, 0, "CustomGeometry");
En Qt 6 el enfoque por defecto es usar el registro automático con la ayuda del sistema de construcción. En lugar de llamar a qmlRegisterType, el archivo .pro ahora puede contener:
CONFIG += qmltypes QML_IMPORT_NAME = Example QML_IMPORT_MAJOR_VERSION = 1
Con CMake, el registro automático es el comportamiento por defecto, por lo que no se necesita ninguna configuración especial más allá de la configuración básica del módulo QML:
qt_add_qml_module(application
URI Example
VERSION 1.0
)La implementación de la clase debe añadir QML_NAMED_ELEMENT:
class CustomGeometry : public QQuick3DGeometry { Q_OBJECT QML_NAMED_ELEMENT(CustomGeometry) ... };
El código QML puede entonces utilizar el tipo personalizado:
import Example 1.0
Model {
id: customModel
geometry: CustomGeometry {
}
}Como mínimo, una geometría personalizada debe tener especificado lo siguiente:
- datos de vértice,
- stride de vértice,
- tipo primitivo,
- un atributo con PositionSemantic.
Estos datos son suficientes para renderizar la malla. Para el dibujo indexado, también es necesario especificar los datos de la memoria intermedia de índice y un atributo con IndexSemantic. Para soportar el picking (entrada), la clase debe especificar el volumen delimitador utilizando setBounds(). Para una iluminación adecuada, se necesita un atributo con NormalSemantic. Cuando el material utiliza texturizado, debe proporcionarse al menos un conjunto de coordenadas UV y describirse en un atributo TexCoord0Semantic o TexCoord1Semantic. Algunos materiales pueden requerir también tangentes y binormales.
Como ejemplo concreto y mínimo, la siguiente clase proporcionaría la geometría de un único triángulo:
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); }
Dependiendo de la iluminación de la escena, el resultado de referenciar esta geometría desde un Modelo:

Nota: Se espera que los datos de los vértices sigan las convenciones de OpenGL. Esto significa que los datos deben ser proporcionados con la suposición de que el eje Y está apuntando hacia arriba en el sistema de coordenadas normalizado del dispositivo, y que las caras frontales tienen un giro en sentido contrario a las agujas del reloj.
Véase también Model y Geometry.
Documentación de las funciones miembro
void QQuick3DGeometry::addAttribute(QQuick3DGeometry::Attribute::Semantic semantic, int offset, QQuick3DGeometry::Attribute::ComponentType componentType)
Añade la descripción de los atributos de los vértices. Cada atributo tiene un semantic, que especifica el uso del atributo y el número de componentes que tiene, un offset desde el inicio hasta el vértice hasta la ubicación del atributo dentro de un vértice y un componentType que especifica el tipo de dato y el tamaño del atributo.
La semántica puede ser una de las siguientes
| Constante | Descripción |
|---|---|
PositionSemantic | El atributo es una posición. 3 componentes: x, y, y z |
NormalSemantic | El atributo es un vector normal. 3 componentes: x, y, y z |
TexCoord0Semantic | El atributo es una coordenada de textura. 2 componentes: u y v |
TexCoord1Semantic | El atributo es una coordenada de textura. 2 componentes: u y v |
TangentSemantic | El atributo es un vector tangente. 3 componentes: x, y y z |
BinormalSemantic | El atributo es un vector binormal. 3 componentes: x, y, y z |
JointSemantic | El atributo es un vector de índice conjunto para el desollado. 4 componentes: índice conjunto 1-4 |
WeightSemantic | El atributo es un vector de peso para el desollado. 4 componentes: peso conjunto 1-4 |
ColorSemantic | El atributo es un vector de color de vértice. 4 componentes: r, g, b, y a |
TargetPositionSemantic | El atributo es una posición para el primer objetivo morph. 3 componentes: x, y, y z |
TargetNormalSemantic | El atributo es un vector normal para el primer objetivo morph. 3 componentes: x, y, y z |
TargetTangentSemantic | El atributo es un vector tangente para el primer objetivo morph. 3 componentes: x, y, y z |
TargetBinormalSemantic | El atributo es un vector binormal para el primer objetivo morph. 3 componentes: x, y, y z |
Además, semantic puede ser IndexSemantic. En este caso, el atributo no representa una entrada en la memoria intermedia de vértices, sino que describe los datos del índice en la memoria intermedia de índices. Dado que siempre hay un único índice por vértice, offset no tiene sentido para la memoria intermedia de índices y debe dejarse a cero.
El tipo de componente puede ser uno de los siguientes:
| Constante | Descripción |
|---|---|
U16Type | El tipo de componente de índice es un entero de 16 bits sin signo. Sólo se admite para IndexSemantic. |
U32Type | El atributo (o componente de índice) es un entero de 32 bits sin signo. |
I32Type | El atributo es un entero de 32 bits con signo. Tenga en cuenta que es posible que las versiones antiguas de OpenGL (como 2.1 u OpenGL ES 2.0) no admitan este tipo de datos. |
F32Type | El atributo es un flotante de precisión simple. |
Nota: Los datos de índice conjunto suelen ser I32Type. También se admite F32Type para permitir el funcionamiento con API, como OpenGL ES 2.0, que no admiten atributos de entrada de vértices enteros.
Nota: Para los datos de índice (IndexSemantic) sólo son sensibles y compatibles U16Type y U32Type.
Nota : TargetXXXSemantics será obsoleto. addTargetAttribute se puede utilizar para los objetivos morph. Ahora estas semánticas sólo se admiten por compatibilidad con versiones anteriores. Si se mezclan con addTargetAttribute y setTargetData, el resultado no puede garantizarse.
void QQuick3DGeometry::addAttribute(const QQuick3DGeometry::Attribute &attribute)
Añade la descripción de atributos de vértice. Cada atributo tiene una semántica, que especifica el uso del atributo y el número de componentes que tiene, un desplazamiento desde el inicio hasta el vértice hasta la ubicación del atributo dentro de un vértice y un componentType que especifica el tipo de datos y el tamaño del atributo.
Se trata de una función sobrecargada.
void QQuick3DGeometry::addSubset(int offset, int count, const QVector3D &boundsMin, const QVector3D &boundsMax, const QString &name = {})
Añade un nuevo subconjunto a la geometría. Los subconjuntos permiten renderizar partes de la geometría con diferentes materiales. Los materiales se especifican en model.
Si la geometría tiene un búfer de índices, entonces offset y count son el desplazamiento primitivo y el recuento de índices en el subconjunto. Si la geometría sólo tiene búfer de vértices, el desplazamiento es el desplazamiento de vértices y el recuento es el número de vértices del subconjunto.
Los límites boundsMin y boundsMax deben encerrar el subconjunto igual que los límites de la geometría. Además, el subconjunto puede tener un name.
[since 6.6] void QQuick3DGeometry::addTargetAttribute(quint32 targetId, QQuick3DGeometry::Attribute::Semantic semantic, int offset, int stride = 0)
Añade la descripción del atributo morph target. Cada atributo tiene un targetId al que pertenece el atributo, un semantic, que especifica el uso del atributo y el número de componentes que tiene, un offset desde el inicio hasta el vértice hasta la ubicación del atributo dentro de un vértice, y un stride que es un tamaño de byte entre los elementos.
Nota: El targetId debe incrementarse desde 0 sin saltarse ningún número y todos los targets deben tener los mismos atributos.
Nota : La semántica es la misma que la del atributo vertex, pero IndexSemantic, JointSementic y WeightSemantic no están permitidos para los atributos target.
Nota: Los componentTypes de todos los atributos de destino deben ser F32Type.
Nota: Si el stride no se indica o es menor o igual que cero, se considera que el atributo está muy empaquetado.
Esta función se introdujo en Qt 6.6.
Véase también addAttribute.
[since 6.6] void QQuick3DGeometry::addTargetAttribute(const QQuick3DGeometry::TargetAttribute &attribute)
Añade la descripción del atributo target morph. Cada atributo tiene un targetId al que pertenece el atributo, una semántica, que especifica el uso del atributo y el número de componentes que tiene, un offset desde el inicio al vértice a la localización del atributo dentro de un vértice, y un stride que es un tamaño de byte entre los elementos.
Se trata de una función sobrecargada.
Esta función se introdujo en Qt 6.6.
QQuick3DGeometry::Attribute QQuick3DGeometry::attribute(int index) const
Devuelve el número de definición del atributo index
Las definiciones de atributos se numeran de 0 a attributeCount() - 1
int QQuick3DGeometry::attributeCount() const
Devuelve el número de atributos definidos para esta geometría.
Véase también attribute.
QVector3D QQuick3DGeometry::boundsMax() const
Devuelve la coordenada máxima del volumen delimitador.
Véase también setBounds.
QVector3D QQuick3DGeometry::boundsMin() const
Devuelve la coordenada mínima del volumen delimitador.
Véase también setBounds.
void QQuick3DGeometry::clear()
Restablece la geometría a su estado inicial, borrando los datos de vértices e índices previamente configurados, así como los atributos.
QByteArray QQuick3DGeometry::indexData() const
Devuelve los datos del búfer de índice.
Véase también setIndexData().
QQuick3DGeometry::PrimitiveType QQuick3DGeometry::primitiveType() const
Devuelve el tipo primitivo utilizado al renderizar. Por defecto es Triangles.
Véase también setPrimitiveType.
void QQuick3DGeometry::setBounds(const QVector3D &min, const QVector3D &max)
Establece el volumen límite de la geometría en el cubo definido por los puntos min y max. Se utiliza para picking.
void QQuick3DGeometry::setIndexData(const QByteArray &data)
Establece el búfer de índice en data. Para utilizar el dibujo indexado, añada un atributo con IndexSemantic
Véase también indexData() y addAttribute.
void QQuick3DGeometry::setIndexData(int offset, const QByteArray &data)
Actualiza un subconjunto del búfer de índice. offset especifica el desplazamiento en bytes, data especifica el tamaño y los datos.
Esta función no redimensionará el búfer. Si offset + data.size() es mayor que el tamaño actual del buffer, los datos sobrepasados serán ignorados.
Nota: Las funciones de actualización parcial de los datos de vértices, índices y objetivos morph no ofrecen ninguna garantía sobre cómo se implementan internamente dichos cambios. Dependiendo de la implementación subyacente, incluso los cambios parciales pueden conducir a la actualización de todo el recurso gráfico.
Se trata de una función sobrecargada.
void QQuick3DGeometry::setPrimitiveType(QQuick3DGeometry::PrimitiveType type)
Establece el tipo primitivo utilizado para el renderizado en type.
| Constante | Descripción |
|---|---|
Points | Las primitivas son puntos. |
LineStrip | Las primitivas son líneas en una tira. |
Lines | Las primitivas son líneas en una lista. |
TriangleStrip | Las primitivas son triángulos en una tira. |
TriangleFan | Los primitivos son triángulos en un abanico. Tenga en cuenta que los abanicos de triángulos pueden no estar soportados en tiempo de ejecución, dependiendo de la API gráfica subyacente. |
Triangles | Los primitivos son triángulos en una lista. |
El valor inicial es Triangles.
Nota: Tenga en cuenta que los abanicos triangulares (TriangleFan) pueden no estar soportados en tiempo de ejecución, dependiendo de la API gráfica subyacente. Por ejemplo, con Direct 3D esta topología no será funcional en absoluto.
Nota: El tamaño de punto para Points y el ancho de línea para Lines y LineStrip están controlados por material. Sin embargo, tenga en cuenta que los tamaños distintos de 1 pueden no ser compatibles en tiempo de ejecución, dependiendo de la API de gráficos subyacente.
Véase también primitiveType().
void QQuick3DGeometry::setStride(int stride)
Establece el stride del búfer de vértices en stride, medido en bytes. Esta es la distancia entre dos vértices consecutivos en el búfer.
Por ejemplo, un búfer de vértices intercalado y apretado para una geometría que utilice PositionSemantic, IndexSemantic, y ColorSemantic tendrá un stride de 28 (Siete flotantes en total: tres para la posición, cuatro para el color y ninguno para los índices, que no van en el búfer de vértices).
Nota: QQuick3DGeometry espera, y sólo funciona con, datos de vértice con una disposición de atributos intercalada.
Véase también stride() y addAttribute.
[since 6.6] void QQuick3DGeometry::setTargetData(const QByteArray &data)
Establece el búfer del objetivo morph data. El buffer debe contener todos los datos del objetivo morph.
Esta función fue introducida en Qt 6.6.
Ver también targetData() y addTargetAttribute.
[since 6.6] void QQuick3DGeometry::setTargetData(int offset, const QByteArray &data)
Actualiza un subconjunto del búfer de destino de morph. offset especifica el desplazamiento en bytes, data especifica el tamaño y los datos.
Esta función no redimensionará el buffer. Si offset + data.size() es mayor que el tamaño actual del buffer, los datos sobrepasados serán ignorados.
Nota: Las funciones de actualización parcial de los datos de vértices, índices y objetivos morph no ofrecen ninguna garantía sobre cómo se implementan internamente dichos cambios. Dependiendo de la implementación subyacente, incluso los cambios parciales pueden conducir a la actualización de todo el recurso gráfico.
Se trata de una función sobrecargada.
Esta función se introdujo en Qt 6.6.
void QQuick3DGeometry::setVertexData(const QByteArray &data)
Establece el búfer de vértices data. El búfer debe contener todos los datos de vértice empaquetados en la matriz, como se describe en las definiciones de atributos. Ten en cuenta que esto no incluye los atributos con IndexSemantic, que pertenecen al búfer de índice.
Véase también vertexData(), addAttribute, setStride, y setIndexData.
void QQuick3DGeometry::setVertexData(int offset, const QByteArray &data)
Actualiza un subconjunto del búfer de vértices. offset especifica el desplazamiento en bytes, data especifica el tamaño y los datos.
Esta función no redimensionará el buffer. Si offset + data.size() es mayor que el tamaño actual del buffer, los datos sobrepasados serán ignorados.
Nota: Las funciones de actualización parcial de datos de vértices, índices y objetivos morph no ofrecen ninguna garantía sobre cómo se implementan internamente dichos cambios. dependiendo de la implementación subyacente, incluso los cambios parciales pueden provocar la actualización de todo el recurso gráfico.
Se trata de una función sobrecargada.
int QQuick3DGeometry::stride() const
Devuelve la longitud en bytes del búfer de vértices.
Véase también setStride.
QVector3D QQuick3DGeometry::subsetBoundsMax(int subset) const
Devuelve el número de límites máximos de un subset.
Véase también subsetBoundsMin.
QVector3D QQuick3DGeometry::subsetBoundsMin(int subset) const
Devuelve el número de límites mínimos de un subset.
Véase también subsetBoundsMax.
int QQuick3DGeometry::subsetCount() const
Devuelve el número de subconjuntos.
int QQuick3DGeometry::subsetCount(int subset) const
Devuelve el recuento de primitivas de subconjunto.
Véase también subsetOffset.
QString QQuick3DGeometry::subsetName(int subset) const
Devuelve el nombre de subset.
int QQuick3DGeometry::subsetOffset(int subset) const
Devuelve el desplazamiento subset a la memoria intermedia de vértices o índices.
Véase también subsetCount.
[since 6.6] QQuick3DGeometry::TargetAttribute QQuick3DGeometry::targetAttribute(int index) const
Devuelve el número de definición del atributo de destino morph index
Las definiciones de atributos se numeran de 0 a attributeCount() - 1
Esta función se introdujo en Qt 6.6.
[since 6.6] int QQuick3DGeometry::targetAttributeCount() const
Devuelve el número de atributos de objetivo morph definidos para esta geometría.
Esta función se introdujo en Qt 6.6.
Véase también targetAttribute.
[since 6.6] QByteArray QQuick3DGeometry::targetData() const
Devuelve los datos del búfer de destino establecidos por setTargetData.
Esta función se introdujo en Qt 6.6.
Véase también setTargetData().
QByteArray QQuick3DGeometry::vertexData() const
Devuelve los datos del búfer de vértices establecidos por setVertexData.
Véase también 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.