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シーンのModelに対してカスタムジオメトリを指定するために使用することができます。
厳密には必須ではありませんが、典型的な使用方法はこのクラスを継承することです。そして、そのサブクラスを型システムに登録することで、QMLに公開します。Modelの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 = 1
CMakeでは、自動登録がデフォルトの動作なので、基本的な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を持つアトリビュートが必要です。マテリアルがテクスチャリングを使用する場合、UV 座標の少なくとも 1 つのセットを提供し、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 | 属性は2法線ベクトルです。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 | 属性は、最初のモーフターゲットの2法線ベクトルです。3成分:x、y、z |
さらに、semantic は、IndexSemantic
。この場合、アトリビュートは頂点バッファのエントリを表すのではなく、インデックスバッファのインデックスデータを記述します。頂点ごとにインデックスは常に1つだけなので、offset はインデックスバッファとしては意味をなさないので、ゼロのままにしておくべきです。
コンポーネントタイプは以下のいずれかになります:
定数 | 説明 |
---|---|
U16Type | インデックスコンポーネントの型は符号なし16ビット整数です。IndexSemantic でのみサポートされる。 |
U32Type | 属性(またはインデックス・コンポーネント)は符号なし 32 ビット整数です。 |
I32Type | 属性は符号付き32ビット整数です。古いOpenGLのバージョン(2.1やOpenGL ES 2.0など)では、このデータ型がサポートされていない可能性があることに注意してください。 |
F32Type | 属性は単精度floatです。 |
注: ジョイントインデックスデータは通常、I32Type
。F32Type
は、OpenGL ES 2.0のような整数頂点入力属性をサポートしないAPIでも機能するようにするためにサポートされています。
注: インデックスデータ(IndexSemantic
)については、U16Type と U32Type のみがサポートされます。
Note: 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 はサブセット内のプリミティブ オフセットとインデックスのカウントです。ジオメトリが頂点バッファのみを持つ場合、オフセットは頂点オフセット、カウントはサブセット内の頂点数です。
境界boundsMin およびboundsMax は、ジオメトリの境界と同様にサブセットを囲む必要があります。また、サブセットはname を持つことができます。
[since 6.6]
void QQuick3DGeometry::addTargetAttribute(quint32 targetId, QQuick3DGeometry::Attribute::Semantic semantic, int offset, int stride = 0)
morph ターゲットのアトリビュート記述を追加します。各アトリビュートは、そのアトリビュートが属するtargetId 、アトリビュートの用途とそのアトリビュートが持つコンポーネントの数を指定するsemantic 、頂点から頂点内のアトリビュート位置までのoffset 、要素間のバイトサイズであるstride を持ちます。
注: targetIdは0から番号を飛ばすことなく増加させ、すべてのターゲットは同じ属性を持つべきである。
注: semanticは頂点属性と同じですが、IndexSemantic、JointSementic、WeightSemanticはターゲット属性では使用できません。
注: すべてのターゲット属性の componentTypes は F32Type でなければなりません。
注意 : stride が与えられていないか、0 以下の場合、属性は密にパックされていると見なされます。
この関数は Qt 6.6 で導入されました。
addAttributeも参照してください 。
[since 6.6]
void QQuick3DGeometry::addTargetAttribute(const QQuick3DGeometry::TargetAttribute &attribute)
これはオーバーロードされた関数です。
morph ターゲット属性の説明を追加します。各属性は、属性が属する targetId、属性の用途と構成要素の数を指定する semantic、頂点から頂点内の属性位置までのオフセット、要素間のバイトサイズである stride を持ちます。
この関数は 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 | プリミティブはリスト内の三角形である。 |
初期値はTriangles
。
注: 三角形ファン(TriangleFan)は、基礎となるグラフィックスAPIによっては、実行時にサポートされない場合があることに注意してください。たとえば、Direct 3Dではこのトポロジーはまったく機能しません。
注記 :Pointsの点サイズと、LinesおよびLineStripの線幅は、material によって制御されます。ただし、基礎となるグラフィックスAPIによっては、1以外のサイズが実行時にサポートされない場合があることに注意してください。
primitiveType()も参照 。
void QQuick3DGeometry::setStride(int stride)
頂点バッファのストライドをstride に設定します。これは、バッファ内の連続する2つの頂点間の距離です。
たとえば、PositionSemantic
、IndexSemantic
、ColorSemantic
を使用するジオメトリのために密に詰め込まれ、インターリーブされた頂点バッファは、28
のストライドを持つことになります (合計 7 つの浮動小数点数: 3 つは位置、4 つは色、そして頂点バッファに入らないインデックスには何もありません)。
注: 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
morph 対象の属性定義番号を返します。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()も参照して ください。
©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。