Spec-Zone.ru › Qt 6.1

Класс QQuick3DGeometry

Базовый класс для определения пользовательской геометрии. Подробнее...

Заголовок: #include <QQuick3DGeometry>
С момента: Qt 5.15
Инициализируется: Geometry
Наследует: QQuick3DObject
  • Список всех членов, включая наследуемые

Открытые функции

void addAttribute(Attribute::Semantic semantic, int offset, Attribute::ComponentType componentType)
void addAttribute(const QQuick3DGeometry::Attribute &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)
void setVertexData(const QByteArray &data)
void setVertexData(int offset, const QByteArray &data)
int stride() 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 = 1

В CMake эквивалент:

set_target_properties(application PROPERTIES
    QT_QML_MODULE_VERSION 1.0
    QT_QML_MODULE_URI Example
)
qt6_qml_type_registration(application)

Реализация класса должна добавлять 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);
}

В зависимости от освещения в сцене, результат ссылки на эту геометрию из модели:

Примечание: Данные вершин ожидают следования соглашениям OpenGL. Это означает, что данные должны предоставляться с предположением, что ось Y направлена вверх в системе координат устройства, и что фронтальные грани имеют против часовой стрелки обход.

См. также Model и Geometry.

Документация по функциям-членам

void QQuick3DGeometry::addAttribute(Attribute::Semantic semantic, int offset, 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 не имеет смысла для буфера индексов и должен быть оставлен равным нулю.

Тип компонента может быть одним из следующих:

Константа Описание
U16Type Атрибут — целое беззнаковое 16-битное число.
U32Type Атрибут — целое беззнаковое 32-битное число.
I32Type Атрибут — целое со знаком 32-битное число.
F32Type Атрибут — плавающее число с одинарной точностью.

Примечание: Совместные данные индексов обычно I32Type. F32Type также поддерживается для обеспечения работы с API, такими как OpenGL ES 2.0, которые не поддерживают целочисленные входные атрибуты вершин.

void QQuick3DGeometry::addAttribute(const QQuick3DGeometry::Attribute &attribute)

Это перегруженный метод.

Добавляет описание атрибута вершины. Каждый атрибут имеет семантику, которая определяет использование атрибута и количество его компонентов, смещение от начала вершины до расположения атрибута внутри вершины, а также componentType, определяющий тип и размер атрибута.

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. Это используется для выбора.

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 эта топология вообще не будет функциональной.

Примечание: Размер точки для точек и толщина линии для линий и LineStrip контролируется материалом. Однако имейте в виду, что размеры, отличные от 1, могут быть не поддерживаемы в режиме выполнения в зависимости от используемого графического API.

См. также primitiveType().

void QQuick3DGeometry::setStride(int stride)

Устанавливает шаг буфера вершин в stride, измеряемый в байтах. Это расстояние между двумя последовательными вершинами в буфере.

Например, плотно упакованный, интерлизованный буфер вершин для геометрии, использующей PositionSemantic, IndexSemantic, и ColorSemantic, будет иметь шаг 28 (Всего семь чисел с плавающей точкой: три для позиции, четыре для цвета и никакие для индексов, которые не входят в буфер вершин.)

Примечание: QQuick3DGeometry ожидает и работает только с данными вершин с интерлизованной структурой атрибутов.

См. также stride() и addAttribute.

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.

QByteArray QQuick3DGeometry::vertexData() const

Возвращает данные буфера вершин, заданные с помощью setVertexData.

См. также setVertexData().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qquick3dgeometry.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API