QQuick3DGeometry Class
Basisklasse zur 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 |
Ausführliche Beschreibung
Mit der Klasse `QQuick3DGeometry` lässt sich eine benutzerdefinierte Geometrie für ein Modell in der Szene „ Qt Quick 3D “ festlegen.
Obwohl dies nicht zwingend erforderlich ist, wird in der Regel von dieser Klasse geerbt. Die Unterklasse wird dann durch Registrierung im Typsystem für QML verfügbar gemacht. Die Eigenschaft „ geometry “ eines Modells kann anschließend so gesetzt werden, dass sie auf eine Instanz des registrierten Typs verweist.
Die allgemeine Struktur einer solchen Klasse sieht in der Regel wie folgt aus:
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 mithilfe des Build-Systems. Anstatt „ qmlRegisterType “ aufzurufen, kann die Datei „ .pro “ nun Folgendes enthalten:
CONFIG += qmltypes
QML_IMPORT_NAME = Example
QML_IMPORT_MAJOR_VERSION = 1Bei CMake ist die automatische Registrierung das Standardverhalten, sodass über die grundlegende Einrichtung des QML-Moduls hinaus keine besonderen Einstellungen 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 die folgenden Angaben enthalten:
- Vertex-Daten,
- Vertex-Stride,
- Primitivtyp,
- ein Attribut mit „PositionSemantic“.
Diese Angaben reichen aus, um das Mesh zu rendern. Für die indizierte Darstellung müssen zusätzlich die Daten des Indexpuffers sowie ein Attribut mit „IndexSemantic“ angegeben werden. Um die Auswahl (Eingabe) zu unterstützen, muss die Klasse das Begrenzungsvolumen mithilfe von „ setBounds()“ angeben. Für eine korrekte Beleuchtung ist ein Attribut mit „NormalSemantic“ erforderlich. Wenn das Material Texturierung verwendet, muss mindestens ein Satz von UV-Koordinaten bereitgestellt und in einem Attribut vom Typ „TexCoord0Semantic“ oder „TexCoord1Semantic“ beschrieben werden. Einige Materialien erfordern möglicherweise auch Tangenten und Binormalen.
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);
}Je nach Beleuchtung in der Szene ergibt sich bei der Referenzierung dieser Geometrie aus einem „Model“:

Hinweis: Es wird erwartet, dassdie Scheitelpunktdaten den OpenGL-Konventionen entsprechen. Das bedeutet, dass die Daten unter der Annahme bereitgestellt werden müssen, dass die Y-Achse im normalisierten Gerätekordinatensystem nach oben zeigt und dass vordere Flächen eine Windung gegen den Uhrzeigersinn aufweisen.
Siehe auch Model und Geometry.
Dokumentation der Member-Funktionen
void QQuick3DGeometry::addAttribute(QQuick3DGeometry::Attribute::Semantic semantic, int offset, QQuick3DGeometry::Attribute::ComponentType componentType)
Fügt eine Beschreibung des Knotenattributs hinzu. Jedes Attribut verfügt über eine „ semantic “, die die Verwendung des Attributs und die Anzahl seiner Komponenten angibt, eine „ offset “, die den Weg vom Anfang über den Knoten bis zur Position des Attributs innerhalb eines Knotens beschreibt, sowie 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 Tangentialvektor. 3 Komponenten: x, y und z |
BinormalSemantic | Das Attribut ist ein Binormalvektor. 3 Komponenten: x, y und z |
JointSemantic | Das Attribut ist ein Gelenkindexvektor für das Skinning. 4 Komponenten: Gelenkindex 1–4 |
WeightSemantic | Das Attribut ist ein Gewichtvektor für das Skinning. 4 Komponenten: Gelenkgewicht 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 Binormalvektor für das erste Morph-Ziel. 3 Komponenten: x, y und z |
Darüber hinaus kann „ semantic “ den Wert „ IndexSemantic “ annehmen. 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 Vertex gibt, ist „ offset “ für den Index-Puffer nicht sinnvoll und sollte auf Null gesetzt 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 vorzeichenlose 32-Bit-Ganzzahl. |
I32Type | Das Attribut ist eine vorzeichenbehaftete 32-Bit-Ganzzahl. Beachten Sie, dass ältere OpenGL-Versionen (wie z. B. 2.1 oder OpenGL ES 2.0) diesen Datentyp möglicherweise nicht unterstützen. |
F32Type | Das Attribut ist eine Gleitkommazahl mit einfacher Genauigkeit. Hinweis: Die Gelenkindexdaten sind typischerweise „ Hinweis: Für Indexdaten ( Hinweis: „TargetXXXSemantics“ wird als veraltet markiert. Für die Morph-Targets kann „ addTargetAttribute “ verwendet werden. Derzeit werden diese Semantiken nur aus Gründen der Abwärtskompatibilität unterstützt. Bei gemischter Verwendung mit „ addTargetAttribute “ und „ setTargetData “ kann das Ergebnis nicht garantiert werden. |
void QQuick3DGeometry::addAttribute(const QQuick3DGeometry::Attribute &attribute)
Fügt eine Beschreibung des Scheitelpunktattributs hinzu. Jedes Attribut verfügt über eine Semantik, die die Verwendung des Attributs und die Anzahl seiner Komponenten angibt, einen Versatz vom Anfang des Scheitelpunkts bis zur Position des Attributs innerhalb eines Scheitelpunkts sowie einen „componentType“, der den Datentyp und die Größe des Attributs angibt.
Dies ist eine überladene Funktion.
void QQuick3DGeometry::addSubset(int offset, int count, const QVector3D &boundsMin, const QVector3D &boundsMax, const QString &name = {})
Fügt der Geometrie eine neue Teilmenge hinzu. Teilmengen ermöglichen es, Teile der Geometrie mit unterschiedlichen Materialien darzustellen. Die Materialien werden in der Datei „ model “ angegeben.
Verfügt die Geometrie über einen Indexpuffer, so sind „ offset “ und „ count “ der Offset der Primitive und die Anzahl der Indizes in der Teilmenge. Verfügt die Geometrie nur über einen Vertexpuffer, so ist der Offset der Vertex-Offset und „count“ die Anzahl der Vertexpunkte in der Teilmenge.
Die Begrenzungen „ boundsMin “ und „ boundsMax “ sollten die Teilmenge ebenso umschließen wie die Geometriegrenzen. Außerdem kann die Teilmenge einen „ name “ haben.
[since 6.6] void QQuick3DGeometry::addTargetAttribute(quint32 targetId, QQuick3DGeometry::Attribute::Semantic semantic, int offset, int stride = 0)
Fügt eine Beschreibung des Morph-Zielattributs hinzu. Jedes Attribut verfügt über eine „ targetId “, zu der das Attribut gehört, eine „ semantic “, die die Verwendung des Attributs und die Anzahl seiner Komponenten angibt, eine „ offset “ vom Anfang über den Scheitelpunkt bis zur Position des Attributs innerhalb eines Scheitelpunkts sowie eine „ stride “, die die Byte-Größe zwischen den Elementen angibt.
Hinweis: Die „targetId“ sollte von 0 aus fortlaufend erhöht werden, ohne Zahlen zu überspringen, und alle Ziele sollten dieselben Attribute aufweisen.
Hinweis: Die Semantik entspricht der des Vertex-Attributs, jedoch sind „IndexSemantic“, „JointSemantic“ und „WeightSemantic“ für Zielattribute nicht zulässig.
Hinweis: Die „componentTypes“ aller Zielattribute müssen vom Typ „F32Type“ sein.
Hinweis: Wenn der „Stride“ nicht angegeben ist oder kleiner oder gleich Null ist, wird das Attribut als „tightly packed“ betrachtet.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch addAttribute.
[since 6.6] void QQuick3DGeometry::addTargetAttribute(const QQuick3DGeometry::TargetAttribute &attribute)
Fügt eine Beschreibung des Morph-Zielattributs hinzu. Jedes Attribut verfügt über eine „targetId“, zu der das Attribut gehört, eine „semantic“, die die Verwendung des Attributs und die Anzahl seiner Komponenten angibt, einen „offset“, der den Abstand vom Anfang des Vertix bis zur Position des Attributs innerhalb eines Vertix angibt, sowie einen „stride“, der die Byte-Größe zwischen den Elementen angibt.
Dies ist eine überladene Funktion.
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 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 in ihren Ausgangszustand zurück und löscht dabei zuvor festgelegte Scheitelpunkt- und Indexdaten sowie Attribute.
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. Der Standardwert ist „ Triangles “.
Siehe auch „ setPrimitiveType “.
void QQuick3DGeometry::setBounds(const QVector3D &min, const QVector3D &max)
Legt das Begrenzungsvolumen der Geometrie auf den Würfel fest, 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 das indizierte Zeichnen zu verwenden, fügen Sie ein Attribut mit IndexSemantic
Siehe auch ` indexData()` und ` addAttribute`.
void QQuick3DGeometry::setIndexData(int offset, const QByteArray &data)
Aktualisiert eine Teilmenge des Indexpuffers. ` offset ` gibt den Offset in Byte an, ` data ` gibt die Größe und die Daten an.
Diese Funktion ändert die Größe des Puffers nicht. Ist offset + data.size() größer als die aktuelle Größe des Puffers, werden die über den Puffer hinausgehenden Daten ignoriert.
Hinweis: Die Funktionen zur teilweisen Aktualisierung von Vertex-, Index- und Morph-Target-Daten bieten keine Garantie dafür, wie solche Änderungen intern umgesetzt werden. Je nach zugrunde liegender Implementierung können selbst teilweise Änderungen dazu führen, dass die gesamte Grafikressource aktualisiert wird.
Dies ist eine überladene Funktion.
void QQuick3DGeometry::setPrimitiveType(QQuick3DGeometry::PrimitiveType type)
Legt den für die Darstellung verwendeten Primitivtyp auf „ type “ fest.
| Konstante | Beschreibung |
|---|---|
Points | Die Primitive sind Punkte. |
LineStrip | Die Primitive sind Linien in einem Streifen. |
Lines | Die Primitive sind Linien in einem Streifen. |
TriangleStrip | Die Primitive sind Dreiecke in einem Streifen. |
TriangleFan | Die Primitive sind 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 | Die Primitive sind Dreiecke in einer Liste. |
Der Anfangswert lautet „ Triangles “.
Hinweis: Beachten Sie , dass Dreiecksfächer (TriangleFan) je nach der zugrunde liegenden Grafik-API zur Laufzeit möglicherweise nicht unterstützt werden. Bei Direct 3D beispielsweise ist diese Topologie überhaupt nicht funktionsfähig.
Hinweis: Die Punktgröße für „Points“ und die Linienbreite für „Lines“ und „LineStrip“ werden durch den Wert „ material “ gesteuert. Beachten Sie jedoch, dass je nach zugrunde liegender Grafik-API andere Werte als 1 zur Laufzeit möglicherweise nicht unterstützt werden.
Siehe auch ` primitiveType()`.
void QQuick3DGeometry::setStride(int stride)
Legt den Schritt des Vertex-Puffers auf stride fest, gemessen in Byte. Dies ist der Abstand zwischen zwei aufeinanderfolgenden Scheitelpunkten im Puffer.
Beispielsweise hat ein dicht gepackter, verschachtelter Vertex-Puffer für eine Geometrie, die „ PositionSemantic “, „ IndexSemantic “ und „ ColorSemantic “ verwendet, einen Stride von „ 28 “ (insgesamt sieben Floats: drei für die Position, vier für die Farbe und keine für Indizes, da diese nicht im Vertex-Puffer enthalten sind).
Hinweis: QQuick3DGeometry erwartet und verarbeitet ausschließlich Vertex-Daten mit einem verschachtelten Attributlayout.
Siehe auch stride() und addAttribute.
[since 6.6] void QQuick3DGeometry::setTargetData(const QByteArray &data)
Legt den Morph-Ziel-Puffer „ data “ fest. 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)
Aktualisiert einen Teilbereich des Morph-Zielpuffers. ` offset ` gibt den Offset in Byte an, ` data ` gibt die Größe und die Daten an.
Diese Funktion passt die Größe des Puffers nicht an. Ist offset + data.size() größer als die aktuelle Größe des Puffers, werden die über den Puffer hinausgehenden Daten ignoriert.
Hinweis: Die Funktionen zur teilweisen Aktualisierung von Vertex-, Index- und Morph-Target-Daten bieten keine Garantie dafür, wie solche Änderungen intern umgesetzt werden. Je nach zugrunde liegender Implementierung können selbst teilweise Änderungen dazu führen, dass die gesamte Grafikressource aktualisiert wird.
Dies ist eine überladene Funktion.
Diese Funktion wurde in Qt 6.6 eingeführt.
void QQuick3DGeometry::setVertexData(const QByteArray &data)
Legt den Vertex-Puffer „ data “ fest. Der Puffer sollte alle im Array gepackten Vertex-Daten enthalten, wie in den Attributdefinitionen beschrieben. Beachten Sie, dass dies keine Attribute mit „ IndexSemantic “ umfasst, die in den Index-Puffer gehören.
Siehe auch „ vertexData()“, „ addAttribute “, „ setStride “ und „ setIndexData “.
void QQuick3DGeometry::setVertexData(int offset, const QByteArray &data)
Aktualisiert eine Teilmenge des Vertex-Puffers. „ offset “ gibt den Offset in Byte an, „ data “ gibt die Größe und die Daten an.
Diese Funktion passt die Größe des Puffers nicht an. Ist offset + data.size() größer als die aktuelle Größe des Puffers, werden die über den Puffer hinausgehenden Daten ignoriert.
Hinweis: Die Funktionen zur teilweisen Aktualisierung von Vertex-, Index- und Morph-Target-Daten bieten keine Garantie dafür, wie solche Änderungen intern umgesetzt werden. Je nach zugrunde liegender Implementierung können bereits teilweise Änderungen dazu führen, dass die gesamte Grafikressource aktualisiert wird.
Dies ist eine überladene Funktion.
int QQuick3DGeometry::stride() const
Gibt den Byte-Schritt des Vertex-Puffers zurück.
Siehe auch „ setStride “.
QVector3D QQuick3DGeometry::subsetBoundsMax(int subset) const
Gibt die Anzahl der maximalen Grenzen eines ` subset` zurück.
Siehe auch „ subsetBoundsMin “.
QVector3D QQuick3DGeometry::subsetBoundsMin(int subset) const
Gibt die Anzahl der Minimalgrenzen eines „ 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 Primitive in der Teilmenge 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 Offset „ subset “ für den Vertex- oder Indexpuffer zurück.
Siehe auch „ subsetCount “.
[since 6.6] QQuick3DGeometry::TargetAttribute QQuick3DGeometry::targetAttribute(int index) const
Gibt die Nummer der Attributdefinition des Morph-Ziels zurück index
Die Attributdefinitionen sind 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 mit ` setTargetData` festgelegten Daten des Zielpuffers zurück.
Diese Funktion wurde in Qt 6.6 eingeführt.
Siehe auch ` setTargetData()`.
QByteArray QQuick3DGeometry::vertexData() const
Gibt die durch ` setVertexData` festgelegten Vertex-Buffer-Daten zurück.
Siehe auch ` 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.