Изменить и обновить геометрию me sh во время выполнения - PullRequest
1 голос
/ 20 января 2020

Этот вопрос и ответ в октябре 2015 года подразумевает, что можно изменить Qt3D me sh и обновить его:

Вопрос

Я хочу использовать Qt3d в ситуации, которая включает динамические c изменения времени выполнения геометрии c данных на стороне приложения.

Каков наилучший способ динамического изменения me sh для сущности ?

Я бы предпочел сделать все это на стороне C ++, но QMe sh, похоже, не предоставляет API для изменения данных me sh.

Я смотрел на некоторые другие примеры создания собственного класса QAbstractMe sh и QAbstractMeshFunctor. Похоже, я мог бы сделать собственный тип me sh, чтобы делать то, что мне нужно, но у меня есть вопрос. Если я сохраню ссылку на QMeshDataPtr, который я создаю из функтора, могу ли я просто изменить данные me sh всякий раз, когда я хочу, и объекты, ссылающиеся на них, будут обновляться автоматически?

Ответ

API для этого немного изменился в 5.6. Данные геометрии c теперь содержатся в одном или нескольких объектах QBuffer, и на них ссылаются один или несколько атрибутов QAttributes, которые описывают расположение данных в буферах. Атрибуты QAttributes визуализируются путем добавления их в компонент QGeometryRenderer.

Вы можете обновить вышеуказанные объекты в главном потоке и вызвать update () или, как и раньше, использовать функтор для пусть бэкэнд сгенерирует данные Dynami c.

Теперь мой вопрос о вызове update(). Какой именно раздел Qt3D API упоминается?

1 Ответ

1 голос
/ 20 января 2020

В каталоге установки Qt на моем компьютере Linux доступен тест:

/home/{user}/Qt5.12.6/5.12.6/Src/qt3d/tests/manual/custom-mesh-update-data-cpp/

, который я обнаружил, перейдя по этой ссылке при поиске в Google по ключевым словам qt3d mesh update.


Приведенный выше тест использует Qt3DRender :: QBuffer API для обновления sh данных:

void QBuffer :: updateData (int offset , const QByteArray & bytes)

Обновляет данные, заменяя их байтами со смещением.

Примечание: эта функция может вызываться через систему мета-объектов и из QML. Смотрите Q_INVOKABLE.

Код выглядит так:

Qt3DRender::QBuffer *vertexDataBuffer;

// ...

QByteArray updateData;

// ...

vertexDataBuffer->updateData(pos,updateData);

// ...
...