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

상세 설명

QQuick3D지오메트리는 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 = 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 {
    }
}

최소한 커스텀 지오메트리에는 다음이 지정되어 있어야 합니다:

  • 버텍스 데이터,
  • 버텍스 보폭
  • 프리미티브 유형,
  • 위치 시맨틱이 있는 어트리뷰트.

이 정도면 메시를 렌더링하기에 충분합니다. 인덱스 드로잉의 경우 인덱스 버퍼 데이터와 인덱스 시맨틱이 있는 어트리뷰트도 지정해야 합니다. 피킹(입력)을 지원하려면 클래스에서 setBounds()를 사용하여 바운딩 볼륨을 지정해야 합니다. 적절한 조명을 위해서는 NormalSemantic이 있는 어트리뷰트가 필요합니다. 머티리얼이 텍스처링을 사용하는 경우, 하나 이상의 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);
}

씬의 조명에 따라 모델에서 이 지오메트리를 참조한 결과입니다:

참고: 버텍스 데이터는 OpenGL 규칙을 따라야 합니다. 즉, 데이터는 정규화된 디바이스 좌표계에서 Y축이 위를 향하고 있고 앞면이 시계 반대 방향으로 감겨 있다는 가정 하에 제공되어야 합니다.

ModelGeometry참조하십시오 .

멤버 함수 문서

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

버텍스 어트리뷰트 설명을 추가합니다. 각 속성에는 속성의 사용법과 속성에 포함된 컴포넌트 수를 지정하는 semantic, 시작부터 버텍스까지의 offset, 버텍스 내부의 속성 위치, 속성의 데이터 유형과 크기를 지정하는 componentType 이 있습니다.

시맨틱은 다음 중 하나가 될 수 있습니다:

ConstantDescription
PositionSemantic속성은 위치입니다. 3개의 구성 요소: x, y, z
NormalSemantic속성은 정규 벡터입니다. 3개의 구성 요소: x, y, z
TexCoord0Semantic속성은 텍스처 좌표입니다. 2개 구성 요소: uv
TexCoord1Semantic속성은 텍스처 좌표입니다. 2개 구성 요소: uv
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

또한 semanticIndexSemantic 일 수 있습니다. 이 경우 어트리뷰트는 버텍스 버퍼의 항목을 나타내는 것이 아니라 인덱스 버퍼의 인덱스 데이터를 설명합니다. 버텍스당 항상 하나의 인덱스만 존재하므로 offset 은 인덱스 버퍼에 의미가 없으므로 0으로 남겨 두어야 합니다.

컴포넌트 유형은 다음 중 하나가 될 수 있습니다:

Constant설명
U16Type인덱스 구성 요소 유형은 부호가 없는 16비트 정수입니다. IndexSemantic 에서만 지원됩니다.
U32Type속성(또는 인덱스 구성 요소)은 부호 없는 32비트 정수입니다.
I32Type속성은 부호화된 32비트 정수입니다. 이전 OpenGL 버전(예: 2.1 또는 OpenGL ES 2.0)에서는 이 데이터 유형을 지원하지 않을 수 있다는 점에 유의하세요.
F32Type속성은 단정밀도 플로트입니다.

참고: 조인트 인덱스 데이터는 일반적으로 I32Type. F32Type 도 지원되며, 이는 정수 버텍스 입력 속성을 지원하지 않는 OpenGL ES 2.0과 같은 API에서 작동할 수 있도록 하기 위한 것입니다.

참고: 인덱스 데이터(IndexSemantic)의 경우 U16Type 및 U32Type만 합리적이며 지원됩니다.

참고: 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 은 하위 집합의 원시 오프셋 및 인덱스 수입니다. 지오메트리에 버텍스 버퍼만 있는 경우, 오프셋은 버텍스 오프셋이고 카운트는 하위 집합의 버텍스 수입니다.

boundsMinboundsMax 바운드는 지오메트리 바운드와 마찬가지로 하위 집합을 둘러싸고 있어야 합니다. 또한 하위 집합은 name 을 가질 수 있습니다.

[since 6.6] void QQuick3DGeometry::addTargetAttribute(quint32 targetId, QQuick3DGeometry::Attribute::Semantic semantic, int offset, int stride = 0)

모프 대상 어트리뷰트 설명을 추가합니다. 각 속성에는 속성이 속한 targetId, 속성의 사용법과 속성이 가진 컴포넌트 수를 지정하는 semantic, 시작부터 버텍스까지 버텍스 내부의 속성 위치까지 offset, 요소 사이의 바이트 크기인 stride 이 있습니다.

참고: targetId는 숫자를 건너뛰지 않고 0에서 증가해야 하며 모든 타깃은 동일한 속성을 가져야 합니다.

참고: 시맨틱은 버텍스 속성과 동일하지만 대상 속성에는 IndexSemantic, JointSemantic 및 WeightSemantic이 허용되지 않습니다.

참고: 모든 대상 어트리뷰트의 componentTypes는 F32Type이어야 합니다.

참고: 보폭이 지정되지 않거나 0보다 작거나 같으면 속성이 밀집된 것으로 간주됩니다.

이 함수는 Qt 6.6에 도입되었습니다.

addAttribute참조하십시오 .

[since 6.6] void QQuick3DGeometry::addTargetAttribute(const QQuick3DGeometry::TargetAttribute &attribute)

오버로드된 함수입니다.

모프 대상 어트리뷰트 설명을 추가합니다. 각 어트리뷰트에는 어트리뷰트가 속하는 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 로 설정합니다.

Constant설명
Points프리미티브는 점입니다.
LineStrip프리미티브는 스트립의 선입니다.
Lines프리미티브는 목록의 선입니다.
TriangleStrip기본 요소는 스트립의 삼각형입니다.
TriangleFan기본 요소는 부채꼴의 삼각형입니다. 기본 그래픽 API에 따라 런타임에 삼각형 팬이 지원되지 않을 수 있다는 점에 유의하세요.
Triangles프리미티브는 목록의 삼각형입니다.

초기 값은 Triangles 입니다.

참고: 기본 그래픽 API에 따라 런타임에 삼각형 팬(TriangleFan)이 지원되지 않을 수 있다는 점에 유의하세요. 예를 들어 Direct 3D에서는 이 토폴로지가 전혀 작동하지 않습니다.

참고: 포인트의 포인트 크기와 라인 및 라인스트립의 라인 너비는 material 에 의해 제어됩니다. 그러나 기본 그래픽 API에 따라 1 이외의 크기는 런타임에 지원되지 않을 수 있습니다.

primitiveType()도 참조하세요 .

void QQuick3DGeometry::setStride(int stride)

버텍스 버퍼의 보폭을 바이트 단위로 측정한 stride 으로 설정합니다. 버퍼에서 연속된 두 버텍스 사이의 거리입니다.

예를 들어 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

모프 타깃 속성 정의 번호를 반환합니다. 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()도 참조하세요 .

© 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.