Класс 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 направлена вверх в системе координат нормализованного устройства и что передние грани имеют против часовой стрелки обход.
Документация по функциям-членам
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