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軸が上を向いており、前面が反時計回りに巻いているという前提でデータを提供する必要があります。

Model およびGeometryも参照して ください。

メンバ関数ドキュメント

void QQuick3DGeometry::addAttribute(QQuick3DGeometry::Attribute::Semantic semantic, int offset, QQuick3DGeometry::Attribute::ComponentType componentType)

頂点属性の説明を追加します。各属性は、semantic (属性の使用法とその属性が持つ構成要素の数を指定)、offset (頂点への先頭から頂点内の属性位置まで)、componentType (属性のデータ型とサイズを指定)を持ちます。

セマンティックは以下のいずれかになります:

定数説明
PositionSemantic属性は位置です。3成分:xyz
NormalSemantic属性は法線ベクトル。3成分:x,y,z
TexCoord0Semantic属性はテクスチャ座標です。2成分:uv
TexCoord1Semantic属性はテクスチャ座標です。2 成分:uv
TangentSemantic属性はタンジェントベクトルです。3成分:xyz
BinormalSemantic属性は2法線ベクトルです。3成分:xyz
JointSemantic属性はスキニングのためのジョイントインデックスベクトルです。4成分: ジョイントインデックス1-4
WeightSemantic属性はスキニングのための重みベクトルです。4成分:ジョイントウェイト1~4
ColorSemantic属性は頂点色ベクトルです。4成分:rgba
TargetPositionSemantic属性は最初のモーフターゲットの位置です。3成分:xyz
TargetNormalSemantic属性は最初のモーフターゲットの法線ベクトルです。3成分:xyz
TargetTangentSemantic属性は最初のモーフターゲットの接線ベクトルです。3成分:xyz
TargetBinormalSemantic属性は、最初のモーフターゲットの2法線ベクトルです。3成分:xyz

さらに、semantic は、IndexSemantic 。この場合、アトリビュートは頂点バッファのエントリを表すのではなく、インデックスバッファのインデックスデータを記述します。頂点ごとにインデックスは常に1つだけなので、offset はインデックスバッファとしては意味をなさないので、ゼロのままにしておくべきです。

コンポーネントタイプは以下のいずれかになります:

定数説明
U16Typeインデックスコンポーネントの型は符号なし16ビット整数です。IndexSemantic でのみサポートされる。
U32Type属性(またはインデックス・コンポーネント)は符号なし 32 ビット整数です。
I32Type属性は符号付き32ビット整数です。古いOpenGLのバージョン(2.1やOpenGL ES 2.0など)では、このデータ型がサポートされていない可能性があることに注意してください。
F32Type属性は単精度floatです。

注: ジョイントインデックスデータは通常、I32TypeF32Type は、OpenGL ES 2.0のような整数頂点入力属性をサポートしないAPIでも機能するようにするためにサポートされています。

注: インデックスデータ(IndexSemantic)については、U16Type と U32Type のみがサポートされます。

Note: TargetXXXSemantics は非推奨となります。addTargetAttribute はモーフターゲットに使用できます。現在、これらのセマンティクスは後方互換性のためだけにサポートされています。これらのセマンティクスがaddTargetAttributesetTargetData と混在して使用された場合、その結果は保証されません。

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 で指定します。

ジオメトリがインデックス バッファを持つ場合、offsetcount はサブセット内のプリミティブ オフセットとインデックスのカウントです。ジオメトリが頂点バッファのみを持つ場合、オフセットは頂点オフセット、カウントはサブセット内の頂点数です。

境界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)

ジオメトリの外接ボリュームを、点minmax で定義される立方体に設定します。これは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つの頂点間の距離です。

たとえば、PositionSemanticIndexSemanticColorSemantic を使用するジオメトリのために密に詰め込まれ、インターリーブされた頂点バッファは、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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。