QQuick3DGeometry Class
Basisklasse für die Definition benutzerdefinierter Geometrie. Mehr...
Header: | #include <QQuick3DGeometry> |
In QML: | Geometry |
Inherits: | QQuick3DObject |
Öffentliche Funktionen
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 |
Detaillierte Beschreibung
QQuick3DGeometry kann verwendet werden, um benutzerdefinierte Geometrie für ein Modell in der Qt Quick 3D Szene zu definieren.
Obwohl nicht unbedingt erforderlich, ist die typische Verwendung die Vererbung von dieser Klasse. Die Unterklasse wird dann durch Registrierung im Typsystem für QML zugänglich gemacht. Die Eigenschaft geometry eines Models kann dann so eingestellt werden, dass sie auf eine Instanz des registrierten Typs verweist.
Die High-Level-Struktur einer solchen Klasse ist in der Regel ähnlich wie die folgende:
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); ... } };
Diese Klasse kann dann als QML-Typ registriert und mit Model verwendet werden.
In Qt 5 erfolgte die Typregistrierung mit qmlRegisterType:
qmlRegisterType<CustomGeometry>("Example", 1, 0, "CustomGeometry");
In Qt 6 ist der Standardansatz die automatische Registrierung mit Hilfe des Build-Systems. Anstatt qmlRegisterType aufzurufen, kann die Datei .pro
nun enthalten:
CONFIG += qmltypes QML_IMPORT_NAME = Example QML_IMPORT_MAJOR_VERSION = 1
Mit CMake ist die automatische Registrierung das Standardverhalten, so dass keine besonderen Einstellungen über das grundlegende QML-Modul-Setup hinaus erforderlich sind:
qt_add_qml_module(application
URI Example
VERSION 1.0
)
Die Klassenimplementierung sollte QML_NAMED_ELEMENT hinzufügen:
class CustomGeometry : public QQuick3DGeometry { Q_OBJECT QML_NAMED_ELEMENT(CustomGeometry) ... };
Der QML-Code kann dann den benutzerdefinierten Typ verwenden:
import Example 1.0
Model {
id: customModel
geometry: CustomGeometry {
}
}
Eine benutzerdefinierte Geometrie sollte mindestens folgende Angaben enthalten:
- Vertex-Daten,
- Vertex-Stride,
- primitiver Typ,
- ein Attribut mit PositionSemantic.
Diese Angaben sind ausreichend, um das Netz zu rendern. Für indexiertes Zeichnen müssen auch die Indexpufferdaten und ein Attribut mit IndexSemantic angegeben werden. Um Picking (Eingabe) zu unterstützen, muss die Klasse das Bounding Volume mit setBounds() angeben. Für die richtige Beleuchtung wird ein Attribut mit NormalSemantic benötigt. Wenn das Material eine Texturierung verwendet, muss mindestens ein Satz von UV-Koordinaten bereitgestellt und in einem TexCoord0Semantic- oder TexCoord1Semantic-Attribut beschrieben werden. Einige Materialien können auch Tangenten und Binormale erfordern.
Als konkretes, minimales Beispiel würde die folgende Klasse die Geometrie für ein einzelnes Dreieck bereitstellen:
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); }
Abhängig von der Beleuchtung in der Szene, das Ergebnis der Referenzierung dieser Geometrie von einem Modell:
Hinweis: Es wird erwartet, dass die Vertex-Daten den OpenGL-Konventionen entsprechen. Das bedeutet, dass die Daten unter der Annahme bereitgestellt werden müssen, dass die Y-Achse im normalisierten Gerätekoordinatensystem nach oben zeigt und dass die Stirnflächen eine Wicklung gegen den Uhrzeigersinn aufweisen.
Siehe auch Model und Geometry.
Dokumentation der Mitgliedsfunktionen
void QQuick3DGeometry::addAttribute(QQuick3DGeometry::Attribute::Semantic semantic, int offset, QQuick3DGeometry::Attribute::ComponentType componentType)
Fügt eine Beschreibung der Scheitelpunkt-Attribute hinzu. Jedes Attribut hat eine semantic, die die Verwendung des Attributs und die Anzahl der Komponenten angibt, die es hat, eine offset vom Anfang bis zum Scheitelpunkt bis zur Position des Attributs innerhalb eines Scheitelpunkts und eine componentType, die den Datentyp und die Größe des Attributs angibt.
Die Semantik kann eine der folgenden sein:
Konstante | Beschreibung |
---|---|
PositionSemantic | Das Attribut ist eine Position. 3 Komponenten: x, y, und z |
NormalSemantic | Das Attribut ist ein Normalenvektor. 3 Komponenten: x, y, und z |
TexCoord0Semantic | Das Attribut ist eine Texturkoordinate. 2 Komponenten: u und v |
TexCoord1Semantic | Das Attribut ist eine Texturkoordinate. 2 Komponenten: u und v |
TangentSemantic | Das Attribut ist ein Tangentenvektor. 3 Komponenten: x, y, und z |
BinormalSemantic | Das Attribut ist ein Binormalvektor. 3 Komponenten: x, y, und z |
JointSemantic | Das Attribut ist ein gemeinsamer Indexvektor für das Skinning. 4 Komponenten: gemeinsamer Index 1-4 |
WeightSemantic | Das Attribut ist ein Gewichtsvektor für das Skinning. 4 Komponenten: gemeinsames Gewicht 1-4 |
ColorSemantic | Das Attribut ist ein Vertex-Farbvektor. 4 Komponenten: r, g, b und a |
TargetPositionSemantic | Das Attribut ist eine Position für das erste Morph-Ziel. 3 Komponenten: x, y und z |
TargetNormalSemantic | Das Attribut ist ein Normalenvektor für das erste Morph-Ziel. 3 Komponenten: x, y und z |
TargetTangentSemantic | Das Attribut ist ein Tangentenvektor für das erste Morph-Ziel. 3 Komponenten: x, y, und z |
TargetBinormalSemantic | Das Attribut ist ein binormaler Vektor für das erste Morph-Ziel. 3 Komponenten: x, y, und z |
Darüber hinaus kann semantic IndexSemantic
sein. In diesem Fall stellt das Attribut keinen Eintrag im Vertex-Puffer dar, sondern beschreibt die Indexdaten im Index-Puffer. Da es immer nur einen Index pro Scheitelpunkt gibt, macht offset für den Indexpuffer keinen Sinn und sollte auf Null belassen werden.
Der Komponententyp kann einer der folgenden sein:
Konstante | Beschreibung |
---|---|
U16Type | Der Indexkomponententyp ist eine vorzeichenlose 16-Bit-Ganzzahl. Wird nur für IndexSemantic unterstützt. |
U32Type | Das Attribut (oder die Indexkomponente) ist eine 32-Bit-Ganzzahl ohne Vorzeichen. |
I32Type | Das Attribut ist eine vorzeichenbehaftete 32-Bit-Ganzzahl. Beachten Sie, dass alte OpenGL-Versionen (z. B. 2.1 oder OpenGL ES 2.0) diesen Datentyp möglicherweise nicht unterstützen. |
F32Type | Das Attribut ist ein single-precision float. |
Hinweis: Die gemeinsamen Indexdaten sind typischerweise I32Type
. F32Type
wird auch unterstützt, um die Funktion mit APIs wie OpenGL ES 2.0 zu ermöglichen, die keine ganzzahligen Vertex-Eingabeattribute unterstützen.
Hinweis: Für Indexdaten (IndexSemantic
) sind nur U16Type und U32Type sinnvoll und werden unterstützt.
Hinweis: TargetXXXSemantics wird veraltet sein. addTargetAttribute kann für die Morph-Ziele verwendet werden. Jetzt werden diese Semantiken nur noch aus Gründen der Abwärtskompatibilität unterstützt. Wenn sie gemischt mit addTargetAttribute und setTargetData verwendet werden, kann das Ergebnis nicht garantiert werden.
void QQuick3DGeometry::addAttribute(const QQuick3DGeometry::Attribute &attribute)
Dies ist eine überladene Funktion.
Fügt die Beschreibung von Vertex-Attributen hinzu. Jedes Attribut hat eine Semantik, die die Verwendung des Attributs und die Anzahl der Komponenten angibt, die es hat, einen Offset vom Anfang des Scheitelpunkts bis zur Position des Attributs innerhalb eines Scheitelpunkts und einen componentType, der den Datentyp und die Größe des Attributs angibt.
void QQuick3DGeometry::addSubset(int offset, int count, const QVector3D &boundsMin, const QVector3D &boundsMax, const QString &name = {})
Fügt der Geometrie eine neue Teilmenge hinzu. Untermengen ermöglichen das Rendern von Teilen der Geometrie mit unterschiedlichen Materialien. Die Materialien werden in model angegeben.
Wenn die Geometrie über einen Indexpuffer verfügt, dann sind offset und count der Primitiv-Offset und die Anzahl der Indizes in der Untergruppe. Wenn die Geometrie nur einen Scheitelpunkt-Puffer hat, ist der Offset der Scheitelpunkt-Offset und die Anzahl die Anzahl der Scheitelpunkte in der Untermenge.
Die Begrenzungen boundsMin und boundsMax sollten die Teilmenge genau wie die Geometriebegrenzungen umschließen. Auch die Teilmenge kann eine name haben.
[since 6.6]
void QQuick3DGeometry::addTargetAttribute(quint32 targetId, QQuick3DGeometry::Attribute::Semantic semantic, int offset, int stride = 0)
Fügt die Beschreibung von Morph-Zielattributen hinzu. Jedes Attribut hat eine targetId, zu der das Attribut gehört, eine semantic, die die Verwendung des Attributs und die Anzahl der Komponenten angibt, die es hat, eine offset vom Anfang bis zum Vertex bis zur Position des Attributs innerhalb eines Vertex, und eine stride, die eine Bytegröße zwischen den Elementen ist.
Hinweis: Die targetId sollte von 0 an erhöht werden, ohne eine Zahl zu überspringen, und alle Ziele sollten die gleichen Attribute haben.
Hinweis: Die Semantik ist dieselbe wie beim Vertex-Attribut, aber IndexSemantic, JointSementic und WeightSemantic sind für Target-Attribute nicht zulässig.
Hinweis: Die componentTypes aller Zielattribute müssen F32Type sein.
Hinweis: Wenn der Stride nicht angegeben wird oder kleiner oder gleich Null ist, wird das Attribut als dicht gepackt betrachtet.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch addAttribute.
[since 6.6]
void QQuick3DGeometry::addTargetAttribute(const QQuick3DGeometry::TargetAttribute &attribute)
Dies ist eine überladene Funktion.
Fügt die Beschreibung von Morph-Zielattributen hinzu. Jedes Attribut hat eine targetId, zu der das Attribut gehört, eine Semantik, die die Verwendung des Attributs und die Anzahl der Komponenten, die es hat, angibt, einen Offset vom Anfang des Vertex bis zur Position des Attributs innerhalb eines Vertex und einen Stride, der eine Bytegröße zwischen den Elementen ist.
Diese Funktion wurde in Qt 6.6 eingeführt.
QQuick3DGeometry::Attribute QQuick3DGeometry::attribute(int index) const
Gibt die Nummer der Attributdefinition zurück index
Die Attributdefinitionen sind nummeriert von 0 bis attributeCount() - 1
int QQuick3DGeometry::attributeCount() const
Gibt die Anzahl der für diese Geometrie definierten Attribute zurück.
Siehe auch attribute.
QVector3D QQuick3DGeometry::boundsMax() const
Gibt die maximale Koordinate des Begrenzungsvolumens zurück.
Siehe auch setBounds.
QVector3D QQuick3DGeometry::boundsMin() const
Gibt die minimale Koordinate des Begrenzungsvolumens zurück.
Siehe auch setBounds.
void QQuick3DGeometry::clear()
Setzt die Geometrie auf ihren Ausgangszustand zurück, wobei zuvor gesetzte Eckpunkt- und Indexdaten sowie Attribute gelöscht werden.
QByteArray QQuick3DGeometry::indexData() const
Gibt die Daten des Indexpuffers zurück.
Siehe auch setIndexData().
QQuick3DGeometry::PrimitiveType QQuick3DGeometry::primitiveType() const
Gibt den beim Rendern verwendeten primitiven Typ zurück. Die Vorgabe ist Triangles
.
Siehe auch setPrimitiveType.
void QQuick3DGeometry::setBounds(const QVector3D &min, const QVector3D &max)
Setzt das Begrenzungsvolumen der Geometrie auf den Würfel, der durch die Punkte min und max definiert ist. Dies wird für picking verwendet.
void QQuick3DGeometry::setIndexData(const QByteArray &data)
Setzt den Indexpuffer auf data. Um indiziertes Zeichnen zu verwenden, fügen Sie ein Attribut mit IndexSemantic
Siehe auch indexData() und addAttribute.
void QQuick3DGeometry::setIndexData(int offset, const QByteArray &data)
Dies ist eine überladene Funktion.
Aktualisiert eine Teilmenge des Indexpuffers. offset gibt den Offset in Bytes an, data gibt die Größe und die Daten an.
Mit dieser Funktion wird die Größe des Puffers nicht verändert. Wenn offset + data.size()
größer ist als die aktuelle Größe des Puffers, werden die überschießenden Daten ignoriert.
Hinweis: Die partiellen Aktualisierungsfunktionen für Vertex-, Index- und Morph-Zieldaten bieten keine Garantie dafür, wie solche Änderungen intern implementiert werden. Je nach der zugrunde liegenden Implementierung können selbst partielle Änderungen zur Aktualisierung der gesamten Grafikressource führen.
void QQuick3DGeometry::setPrimitiveType(QQuick3DGeometry::PrimitiveType type)
Setzt den für das Rendering verwendeten Primitivtyp auf type.
Konstante | Beschreibung |
---|---|
Points | Die Primitive sind Punkte. |
LineStrip | Bei den Primitiven handelt es sich um Linien in einem Streifen. |
Lines | Die Primitive sind Linien in einer Liste. |
TriangleStrip | Die Primitive sind Dreiecke in einem Streifen. |
TriangleFan | Bei den Primitiven handelt es sich um Dreiecke in einem Fächer. Beachten Sie, dass Dreiecksfächer je nach der zugrunde liegenden Grafik-API zur Laufzeit möglicherweise nicht unterstützt werden. |
Triangles | Bei den Primitiven handelt es sich um Dreiecke in einer Liste. |
Der Anfangswert ist Triangles
.
Hinweis: Beachten Sie, dass Dreiecksfächer (TriangleFan) je nach zugrunde liegender Grafik-API möglicherweise nicht zur Laufzeit unterstützt werden. Bei Direct 3D wird diese Topologie zum Beispiel überhaupt nicht funktionieren.
Hinweis: Die Punktgröße für Points und die Linienbreite für Lines und LineStrip werden von material gesteuert. Beachten Sie jedoch, dass je nach der zugrunde liegenden Grafik-API andere Größen als 1 zur Laufzeit möglicherweise nicht unterstützt werden.
Siehe auch primitiveType().
void QQuick3DGeometry::setStride(int stride)
Setzt die Schrittweite des Scheitelpunktpuffers auf stride, gemessen in Bytes. Dies ist der Abstand zwischen zwei aufeinanderfolgenden Scheitelpunkten im Puffer.
Ein dicht gepackter, verschachtelter Scheitelpunktpuffer für eine Geometrie, die PositionSemantic
, IndexSemantic
und ColorSemantic
verwendet, hat zum Beispiel einen Stride von 28
(insgesamt sieben Floats: drei für die Position, vier für die Farbe und keine für die Indizes, die nicht in den Scheitelpunktpuffer gehen).
Hinweis: QQuick3DGeometry erwartet Scheitelpunktdaten mit einem verschachtelten Attribut-Layout und funktioniert nur damit.
Siehe auch stride() und addAttribute.
[since 6.6]
void QQuick3DGeometry::setTargetData(const QByteArray &data)
Setzt den Morph-Ziel-Puffer data. Der Puffer sollte alle Morph-Ziel-Daten enthalten.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch targetData() und addTargetAttribute.
[since 6.6]
void QQuick3DGeometry::setTargetData(int offset, const QByteArray &data)
Dies ist eine überladene Funktion.
Aktualisiert eine Teilmenge des Morph-Zielpuffers. offset gibt den Offset in Bytes an, data gibt die Größe und die Daten an.
Diese Funktion verändert nicht die Größe des Puffers. Wenn offset + data.size()
größer ist als die aktuelle Größe des Puffers, werden die überschießenden Daten ignoriert.
Hinweis: Die partiellen Aktualisierungsfunktionen für Vertex-, Index- und Morph-Zieldaten bieten keine Garantie dafür, wie solche Änderungen intern implementiert werden. Abhängig von der zugrundeliegenden Implementierung können selbst partielle Änderungen dazu führen, dass die gesamte Grafikressource aktualisiert wird.
Diese Funktion wurde in Qt 6.6 eingeführt.
void QQuick3DGeometry::setVertexData(const QByteArray &data)
Setzt den Scheitelpunktpuffer data. Der Puffer sollte alle Scheitelpunktdaten enthalten, die im Array gepackt sind, wie in den Attributdefinitionen beschrieben. Beachten Sie, dass dies keine Attribute mit IndexSemantic
beinhaltet, die in den Indexpuffer gehören.
Siehe auch vertexData(), addAttribute, setStride, und setIndexData.
void QQuick3DGeometry::setVertexData(int offset, const QByteArray &data)
Dies ist eine überladene Funktion.
Aktualisiert eine Teilmenge des Vertex-Puffers. offset gibt den Offset in Bytes an, data die Größe und die Daten.
Diese Funktion verändert nicht die Größe des Puffers. Wenn offset + data.size()
größer ist als die aktuelle Größe des Puffers, werden die überschießenden Daten ignoriert.
Hinweis: Die Funktionen zur teilweisen Aktualisierung von Scheitelpunkt-, Index- und Morph-Zieldaten bieten keine Garantie dafür, wie solche Änderungen intern implementiert werden. Je nach der zugrunde liegenden Implementierung können selbst teilweise Änderungen zur Aktualisierung der gesamten Grafikressource führen.
int QQuick3DGeometry::stride() const
Gibt den Byte-Stride des Vertex-Puffers zurück.
Siehe auch setStride.
QVector3D QQuick3DGeometry::subsetBoundsMax(int subset) const
Gibt die Anzahl der maximalen Schranken einer subset zurück.
Siehe auch subsetBoundsMin.
QVector3D QQuick3DGeometry::subsetBoundsMin(int subset) const
Gibt die Anzahl der minimalen Grenzen einer subset zurück.
Siehe auch subsetBoundsMax.
int QQuick3DGeometry::subsetCount() const
Gibt die Anzahl der Teilmengen zurück.
int QQuick3DGeometry::subsetCount(int subset) const
Gibt die Anzahl der Untermengenprimitive zurück.
Siehe auch subsetOffset.
QString QQuick3DGeometry::subsetName(int subset) const
Gibt den Namen subset zurück.
int QQuick3DGeometry::subsetOffset(int subset) const
Gibt den subset Offset zum Vertex- oder Indexpuffer zurück.
Siehe auch subsetCount.
[since 6.6]
QQuick3DGeometry::TargetAttribute QQuick3DGeometry::targetAttribute(int index) const
Gibt die Nummer der Morph-Zielattributdefinition zurück index
Die Attributdefinitionen werden von 0 bis attributeCount() - 1
Diese Funktion wurde in Qt 6.6 eingeführt.
[since 6.6]
int QQuick3DGeometry::targetAttributeCount() const
Gibt die Anzahl der für diese Geometrie definierten Morph-Zielattribute zurück.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch targetAttribute.
[since 6.6]
QByteArray QQuick3DGeometry::targetData() const
Gibt die Zielpufferdaten zurück, die durch setTargetData gesetzt wurden.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch setTargetData().
QByteArray QQuick3DGeometry::vertexData() const
Gibt die Scheitelpunktpufferdaten zurück, die von setVertexData gesetzt wurden.
Siehe auch setVertexData().
© 2025 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.