QQuick3DGeometry Class
カスタムジオメトリを定義するための基底クラス。詳細...
| Header: | #include <QQuick3DGeometry> |
| In QML: | Geometry |
| Inherits: | QQuick3DObject |
パブリック関数
| 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 |
詳細な説明
QQuick3DGeometry を使用すると、Qt Quick の 3D シーン内のモデルに対してカスタムジオメトリを指定できます。
厳密には必須ではありませんが、一般的な使用法としては、このクラスを継承します。その後、サブクラスを型システムに登録することで、QML から利用可能になります。これにより、モデルのgeometry プロパティを、登録された型のインスタンスを参照するように設定できます。
このようなクラスの大まかな構造は、通常次のようなものになります。
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);
...
}
};このクラスは、QML タイプとして登録し、Model とともに使用することができます。
Qt 5 では、型の登録は `qmlRegisterType` によって行われていました:
qmlRegisterType<CustomGeometry>("Example", 1, 0, "CustomGeometry");Qt 6 では、ビルドシステムを利用した自動登録がデフォルトのアプローチとなっています。qmlRegisterType を呼び出す代わりに、.pro ファイルには次のように記述できます:
CONFIG += qmltypes
QML_IMPORT_NAME = Example
QML_IMPORT_MAJOR_VERSION = 1CMake では、自動登録がデフォルトの動作であるため、基本的な QML モジュールの設定以外に特別な設定は必要ありません:
qt_add_qml_module(application
URI Example
VERSION 1.0
)クラス実装では、QML_NAMED_ELEMENT を追加する必要があります:
class CustomGeometry : public QQuick3DGeometry
{
Q_OBJECT
QML_NAMED_ELEMENT(CustomGeometry)
...
};これにより、QML コードでカスタム型を使用できるようになります:
import Example 1.0
Model {
id: customModel
geometry: CustomGeometry {
}
}カスタムジオメトリには、少なくとも以下の項目を指定する必要があります:
- 頂点データ、
- 頂点ストライド、
- プリミティブ型、
- PositionSemantic を持つ属性。
これらがあれば、メッシュのレンダリングには十分です。インデックス付き描画を行う場合は、インデックスバッファデータと、IndexSemanticを持つ属性も指定する必要があります。ピッキング(入力)をサポートするためには、クラスはsetBounds() を使用してバウンディングボリュームを指定する必要があります。 適切なライティングを行うには、NormalSemanticを持つ属性が必要です。マテリアルがテクスチャリングを使用する場合、少なくとも1組のUV座標を提供し、TexCoord0SemanticまたはTexCoord1Semantic属性で記述する必要があります。マテリアルによっては、タンジェントやバイノーマルも必要になる場合があります。
具体的かつ最小限の例として、以下のクラスは単一の三角形に対するジオメトリを提供します:
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);
}シーン内の照明設定に応じて、Modelからこのジオメトリを参照した結果は次のようになります:

注:頂点 データは OpenGLの規約に従うことが求められます。つまり、データは、正規化されたデバイス座標系においてY軸が上向きであり、前面が反時計回りに巻き込まれているという前提で提供されなければなりません。
メンバ関数のドキュメント
void QQuick3DGeometry::addAttribute(QQuick3DGeometry::Attribute::Semantic semantic, int offset, QQuick3DGeometry::Attribute::ComponentType componentType)
頂点属性の説明を追加します。各属性には、属性の使用方法とコンポーネント数を指定する「semantic 」、先頭から頂点、そして頂点内の属性位置までの「offset 」、および属性のデータ型とサイズを指定する「componentType 」があります。
セマンティックは以下のいずれかになります:
| 定数 | 説明 |
|---|---|
PositionSemantic | この属性は位置を表します。3つの成分:x、y、z |
NormalSemantic | 属性は法線ベクトルです。3つの成分:x、y、z |
TexCoord0Semantic | この属性はテクスチャ座標です。2つの成分:uおよびv |
TexCoord1Semantic | この属性はテクスチャ座標です。2つの成分:uとv |
TangentSemantic | この属性は接線ベクトルです。3つの成分:x、y、z |
BinormalSemantic | この属性は副法線ベクトルです。3つの成分:x、y、z |
JointSemantic | この属性は、スキニング用のジョイントインデックスベクトルです。4つの成分:ジョイントインデックス1~4 |
WeightSemantic | この属性は、スキニング用のウェイトベクトルです。4つの成分:ジョイントウェイト1~4 |
ColorSemantic | この属性は頂点カラーベクトルです。4つの成分:r、g、b、a |
TargetPositionSemantic | この属性は、最初のモーフターゲットの位置です。3つの成分:x、y、z |
TargetNormalSemantic | この属性は、最初のモーフターゲットの法線ベクトルです。3つの成分:x、y、z |
TargetTangentSemantic | この属性は、最初のモーフターゲットの接線ベクトルです。3つの成分:x、y、z |
TargetBinormalSemantic | この属性は、最初のモーフターゲットのバイノーマルベクトルです。3つの成分:x、y、z |
さらに、semantic はIndexSemantic となる場合があります。この場合、この属性は頂点バッファ内のエントリを表すのではなく、インデックスバッファ内のインデックスデータを記述します。頂点ごとにインデックスは常に1つしかないため、offset はインデックスバッファでは意味をなさないため、ゼロのままにしておく必要があります。
コンポーネントタイプは、以下のいずれかになります:
| 定数 | 説明 |
|---|---|
U16Type | インデックスコンポーネントの型は、符号なし16ビット整数です。IndexSemantic でのみサポートされています。 |
U32Type | 属性(またはインデックスコンポーネント)は、符号なし32ビット整数です。 |
I32Type | 属性は、符号付き32ビット整数です。古いバージョンのOpenGL(2.1やOpenGL ES 2.0など)では、このデータ型がサポートされていない場合があることに注意してください。 |
F32Type | 属性は単精度浮動小数点数です。 注:ジョイントインデックスデータは 通常、 注: インデックスデータ( 注:TargetXXXSemanticsは 非推奨となります。モーフターゲットにはaddTargetAttribute を使用できます。現在、これらのセマンティクスは下位互換性のためにのみサポートされています。addTargetAttribute やsetTargetData と混在して使用した場合、結果は保証されません。 |
void QQuick3DGeometry::addAttribute(const QQuick3DGeometry::Attribute &attribute)
頂点属性の説明を追加します。各属性には、その属性の使用方法と構成要素の数を指定する「セマンティック」、頂点の先頭から属性の位置までのオフセット、および属性のデータ型とサイズを指定する「componentType」があります。
これはオーバーロードされた関数です。
void QQuick3DGeometry::addSubset(int offset, int count, const QVector3D &boundsMin, const QVector3D &boundsMax, const QString &name = {})
ジオメトリに新しいサブセットを追加します。サブセットを使用すると、ジオメトリの一部を異なるマテリアルでレンダリングすることができます。マテリアルは、model で指定されます。
ジオメトリにインデックスバッファがある場合、offset およびcount は、サブセット内のプリミティブオフセットとインデックスの数となります。ジオメトリに頂点バッファしかない場合、オフセットは頂点オフセットとなり、count はサブセット内の頂点数となります。
境界boundsMin およびboundsMax は、ジオメトリの境界と同様に、サブセットを囲む必要があります。また、サブセットにはname を指定することもできます。
[since 6.6] void QQuick3DGeometry::addTargetAttribute(quint32 targetId, QQuick3DGeometry::Attribute::Semantic semantic, int offset, int stride = 0)
モーフターゲット属性の説明を追加します。各属性には、その属性が属するtargetId 、属性の使用方法と構成要素の数を指定するsemantic 、頂点から頂点内の属性位置までのoffset 、および要素間のバイトサイズを表すstride があります。
注: targetIdは 0 から番号を飛ばさずに連番で割り当てる必要があり、すべてのターゲットは同一の属性を持つ必要があります。
注: セマンティックは 頂点属性と同じですが、target属性ではIndexSemantic、JointSemantic、WeightSemanticは使用できません。
注: すべてのターゲット属性の componentTypesは F32Type でなければなりません。
注: stride が指定されていないか、0 以下の場合 、その属性はタイトパックとみなされます。
この関数は Qt 6.6 で導入されました。
addAttributeも参照してください 。
[since 6.6] void QQuick3DGeometry::addTargetAttribute(const QQuick3DGeometry::TargetAttribute &attribute)
モーフターゲット属性の説明を追加します。各属性には、その属性が属する targetId、属性の使用方法と構成要素の数を指定するセマンティック、頂点の先頭からその属性の位置までのオフセット、および要素間のバイトサイズを表すストライドがあります。
これはオーバーロードされた関数です。
この関数は Qt 6.6 で導入されました。
QQuick3DGeometry::Attribute QQuick3DGeometry::attribute(int index) const
属性定義番号を返すindex
属性定義には0からattributeCount() - 1
int QQuick3DGeometry::attributeCount() const
このジオメトリに対して定義されている属性の数を返します。
attributeも参照してください 。
QVector3D QQuick3DGeometry::boundsMax() const
バウンディングボリュームの最大座標を返します。
setBoundsも参照してください 。
QVector3D QQuick3DGeometry::boundsMin() const
バウンディングボリュームの最小座標を返します。
setBoundsも参照してください 。
void QQuick3DGeometry::clear()
ジオメトリを初期状態にリセットし、以前に設定された頂点データ、インデックスデータ、および属性をすべてクリアします。
QByteArray QQuick3DGeometry::indexData() const
インデックスバッファのデータを返します。
setIndexData()も参照してください 。
QQuick3DGeometry::PrimitiveType QQuick3DGeometry::primitiveType() const
レンダリング時に使用されるプリミティブ型を返します。デフォルトはTriangles です。
「setPrimitiveType」も参照してください 。
void QQuick3DGeometry::setBounds(const QVector3D &min, const QVector3D &max)
ジオメトリのバウンディングボリュームを、点min およびmax で定義される立方体に設定します。これはpicking で使用されます。
void QQuick3DGeometry::setIndexData(const QByteArray &data)
インデックスバッファをdata に設定します。インデックス付き描画を使用するには、次のような属性を追加してください。IndexSemantic
indexData() およびaddAttributeも参照してください 。
void QQuick3DGeometry::setIndexData(int offset, const QByteArray &data)
インデックスバッファの一部を更新します。offset はバイト単位のオフセットを指定し、data はサイズとデータを指定します。
この関数はバッファのサイズを変更しません。offset + data.size() がバッファの現在のサイズよりも大きい場合、はみ出したデータは無視されます。
注: 頂点、インデックス、およびモーフターゲットデータに対する部分更新関数は 、そのような変更が内部でどのように実装されるかについて、いかなる保証も提供しません。基盤となる実装によっては、部分的な変更であっても、グラフィックスリソース全体の更新につながる可能性があります。
これはオーバーロードされた関数です。
void QQuick3DGeometry::setPrimitiveType(QQuick3DGeometry::PrimitiveType type)
レンダリングに使用するプリミティブ型をtype に設定します。
| 定数 | 説明 |
|---|---|
Points | プリミティブは点です。 |
LineStrip | プリミティブは、ストリップ内の線です。 |
Lines | プリミティブはリスト内の線です。 |
TriangleStrip | プリミティブは、ストリップ内の三角形です。 |
TriangleFan | プリミティブはファン状に配置された三角形です。基盤となるグラフィックス API によっては、実行時に三角形のファンがサポートされない場合があることに注意してください。 |
Triangles | プリミティブは、リスト内の三角形です。初期値は `xml-ph-0000@deepl.internal` です。 |
初期値はTriangles です。
注: 基盤となるグラフィックス API によっては、実行時に三角ファン (TriangleFan) がサポートされない場合があることに注意してください 。たとえば、Direct 3D では、このトポロジーはまったく機能しません。
注: Points の点サイズ、および Lines および LineStrip の線幅は、material によって制御されます。ただし、基盤となるグラフィックス API によっては、1 以外のサイズが実行時にサポートされない場合があることに注意してください。
primitiveType()も参照してください 。
void QQuick3DGeometry::setStride(int stride)
頂点バッファのストライドを、バイト単位でstride に設定します。これは、バッファ内の2つの連続する頂点間の距離です。
たとえば、PositionSemantic 、IndexSemantic 、ColorSemantic を使用するジオメトリ用の、高密度にパッキングされたインターリーブ型頂点バッファの場合、ストライドは28 になります(合計 7 つの浮動小数点数:位置用に 3 つ、色用に 4 つ、インデックス用は 0 つ。インデックスは頂点バッファには含まれません)。
注: QQuick3DGeometry は 、インターリーブされた属性レイアウトを持つ頂点データのみを受け付け、動作します。
stride() およびaddAttributeも参照してください 。
[since 6.6] void QQuick3DGeometry::setTargetData(const QByteArray &data)
モーフターゲットバッファ `data` を設定します。このバッファには、すべてのモーフターゲットデータが格納されている必要があります。
この関数は Qt 6.6 で導入されました。
targetData() およびaddTargetAttributeも参照してください 。
[since 6.6] void QQuick3DGeometry::setTargetData(int offset, const QByteArray &data)
モーフターゲットバッファの一部を更新します。offset はバイト単位のオフセットを指定し、data はサイズとデータを指定します。
この関数はバッファのサイズを変更しません。offset + data.size() がバッファの現在のサイズより大きい場合、バッファの範囲を超えるデータは無視されます。
注: 頂点、インデックス、およびモーフターゲットデータの部分更新関数 については、そのような変更が内部でどのように実装されるかについて、いかなる保証も提供されません。基盤となる実装によっては、部分的な変更であっても、グラフィックスリソース全体の更新につながる可能性があります。
これはオーバーロードされた関数です。
この関数は Qt 6.6 で導入されました。
void QQuick3DGeometry::setVertexData(const QByteArray &data)
頂点バッファdata を設定します。このバッファには、属性定義に記載されているとおり、配列にパックされたすべての頂点データが格納されている必要があります。なお、これにはIndexSemantic を持つ属性は含まれません。これらの属性はインデックスバッファに格納されます。
vertexData()、addAttribute 、setStride 、およびsetIndexDataも参照してください 。
void QQuick3DGeometry::setVertexData(int offset, const QByteArray &data)
頂点バッファの一部を更新します。offset はバイト単位のオフセットを指定し、data はサイズとデータを指定します。
この関数はバッファのサイズを変更しません。offset + data.size() がバッファの現在のサイズよりも大きい場合、サイズを超えたデータは無視されます。
注: 頂点、インデックス、およびモーフターゲットデータの部分更新関数 については、そのような変更が内部でどのように実装されるかについて、いかなる保証も提供されません。基盤となる実装によっては、部分的な変更であっても、グラフィックスリソース全体の更新につながる可能性があります。
これはオーバーロードされた関数です。
int QQuick3DGeometry::stride() const
頂点バッファのバイトストライドを返します。
setStrideも参照してください 。
QVector3D QQuick3DGeometry::subsetBoundsMax(int subset) const
subset の最大境界の数を返します。
「subsetBoundsMin」も参照してください 。
QVector3D QQuick3DGeometry::subsetBoundsMin(int subset) const
subset の最小境界の数を返します。
「subsetBoundsMax」も参照してください 。
int QQuick3DGeometry::subsetCount() const
部分集合の数を返します。
int QQuick3DGeometry::subsetCount(int subset) const
サブセットプリミティブの数を返します。
subsetOffsetも参照してください 。
QString QQuick3DGeometry::subsetName(int subset) const
subset の名前を返します。
int QQuick3DGeometry::subsetOffset(int subset) const
頂点バッファまたはインデックスバッファに対するsubset のオフセットを返します。
「subsetCount」も参照してください 。
[since 6.6] QQuick3DGeometry::TargetAttribute QQuick3DGeometry::targetAttribute(int index) const
モーフターゲット属性の定義番号を返すindex
属性定義には 0 からattributeCount() - 1
この関数は Qt 6.6 で導入されました。
[since 6.6] int QQuick3DGeometry::targetAttributeCount() const
このジオメトリに対して定義されているモーフターゲット属性の数を返します。
この関数は Qt 6.6 で導入されました。
targetAttributeも参照してください 。
[since 6.6] QByteArray QQuick3DGeometry::targetData() const
setTargetData で設定されたターゲットバッファのデータを返します。
この関数は Qt 6.6 で導入されました。
setTargetData()も参照してください 。
QByteArray QQuick3DGeometry::vertexData() const
setVertexData で設定された頂点バッファデータを返します。
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.