0

我正在使用 QQuickImageProvider 将 3d 扫描仪图像从 C++ 传递到 QML,然后将这些图像用作模型的客户纹理(在此处使用 qt quick 3d)。我遇到了纹理闪烁变黑的问题。它经常重复。我曾经将流图像作为 VideoOutput 进行调查,但这种方法不适合我,因为我必须使用表面的几何数据,并且在 VideoOutput 的情况下,它不允许将这些图像映射到几何坐标上。你能在这种情况下给点建议吗?下面是我的代码示例。

质量管理体系:

Image {
   id: textureImage
   source: renderControl.sourceUrl
   anchors.fill: parent
   visible: false // tried with cache true and false both
                }
 Node {
   id: mainScene
   DirectionalLight {
       position: Qt.vector3d(-500, 500, -100)
       ambientColor: Qt.rgba(1.0, 1.0, 1.0, 0.5)
   }
   Model {
       id: viewModel
       position: Qt.vector3d(0, 50, 0)
       visible: true
       scale: Qt.vector3d(10, 11, 4)

       geometry:  RenderData{ // C++ class which sends url to image provider
              id: renderControl
              objectName: "geometryData"
              }

              DefaultMaterial {
                id: defaultMaterial
                Texture {
                   id: baseColorMap
                   sourceItem: textureImage
                }
                cullMode: DefaultMaterial.NoCulling
                diffuseMap: baseColorMap
                }

                materials: [
                   defaultMaterial
                ]
              }

C++

。H

class TextureImageProvider : public QObject, public QQuickImageProvider
{
  QImage requestImage(const QString& id, QSize* size, const QSize& requestedSize) override;
 Q_SIGNALS:
  void imageUpdated(const QUrl& imageUrl);
 std::shared_ptr<QImage> textureImage_;  
}

class RenderData : public QQuick3DGeometry
{
    Q_OBJECT
    Q_PROPERTY(QUrl sourceUrl READ sourceUrl WRITE setSourceUrl NOTIFY sourceUrlChanged)
        TextureImageProvider* imageProvider_;   

}

.cpp

void RenderData::updateData(QImage& textureImage)
{
const QUrl imageUrl = QString("image://texture_image_provider/%1").arg(Uuid::createUuid().toString().c_str());
   textureImage_ = std::make_shared<QImage>(image);
   Q_EMIT imageUpdated(url);
}

QImage TextureImageProvider::requestImage(const QString& id, QSize* size, const QSize& requestedSize)
{
    return *textureImage_;
}

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
{
   engine_->addImageProvider("texture_image_provider", &renderData_-getImageProvider());
}
4

0 回答 0