Spec-Zone.ru › Qt

Класс 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 автоматическая регистрация является по умолчанию, поэтому нет необходимости в дополнительных настройках помимо базовой настройки модуля 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);
}

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

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

См. также Model и Геометрия.

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

void QQuick3DGeometry::addAttribute(Attribute::Semantic semantic, int offset, 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 Атрибут — вектор бинормали. 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)

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

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

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

Примечание: Размер точки для Точек и ширина линии для Линий и Линии полосы регулируются материалом. Однако следует учитывать, что размеры, отличные от 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.2/qquick3dgeometry.html

Spec-Zone.ru

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