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에 노출시킵니다. 그러면 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 = 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 속성이 필요합니다. 머티리얼이 텍스처링을 사용하는 경우, 최소한 한 세트의 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 )가 있습니다.
의미(semantic)는 다음 중 하나일 수 있습니다:
| 상수 | 설명 |
|---|---|
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`일 수 있습니다. 이 경우 해당 속성은 버텍스 버퍼의 항목을 나타내는 것이 아니라, 인덱스 버퍼의 인덱스 데이터를 기술합니다. 버텍스당 인덱스는 항상 하나뿐이므로, ` offset `는 인덱스 버퍼에서는 의미가 없으며 0으로 남겨두어야 합니다.
컴포넌트 유형은 다음 중 하나일 수 있습니다:
| 상수 | 설명 |
|---|---|
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)
버텍스 속성 설명을 추가합니다. 각 속성에는 속성의 용도와 구성 요소 수를 지정하는 ‘semantic’, 버텍스 시작 지점부터 속성 위치까지의 오프셋, 그리고 속성의 데이터 유형과 크기를 지정하는 ‘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)
모프 타겟 속성 설명을 추가합니다. 각 속성에는 해당 속성이 속한 targetId, 속성의 용도와 구성 요소 수를 지정하는 semantic, 시작점부터 정점을 거쳐 정점 내 속성 위치까지의 경로인 offset, 그리고 요소들 사이의 바이트 크기를 나타내는 stride 가 있습니다.
참고: targetId는 0부터 번호를 건너뛰지 않고 순차적으로 증가시켜야 하며, 모든 타깃은 동일한 속성을 가져야 합니다.
참고: 시맨틱은 정점 속성과 동일하지만, 타겟 속성의 경우 IndexSemantic, JointSemantic 및 WeightSemantic은 사용할 수 없습니다.
참고: 모든 타깃 속성의componentTypes는 F32Type이어야 합니다.
참고: stride가 지정되지 않았거나 0 이하인경우 , 해당 속성은 타이트 팩(tightly packed)으로 간주됩니다.
이 함수는 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 | 기본 도형은 목록에 포함된 삼각형입니다. |
초기 값은 Triangles 입니다.
참고: 기본 그래픽 API에 따라 실행 시 삼각형 팬(TriangleFan)이 지원되지 않을 수있습니다 . 예를 들어, Direct 3D의 경우 이 토폴로지는 전혀 작동하지 않습니다.
참고: Points의점 크기와 Lines 및 LineStrip의 선 너비는 material 에 의해 제어됩니다. 그러나 기본 그래픽 API에 따라 1 이외의 크기는 런타임에서 지원되지 않을 수 있으므로 주의하십시오.
primitiveType()도 참조하십시오 .
void QQuick3DGeometry::setStride(int stride)
버텍스 버퍼의 스트라이드를 stride(바이트 단위)로 설정합니다. 이는 버퍼 내 두 연속된 버텍스 사이의 거리입니다.
예를 들어, 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.