如何将QImage从C++发送到QML到Qt3D实体以将其用作纹理?

How to send QImage to Qt3D Entity from C++ to QML for using it as texture?

本文关键字:实体 纹理 Qt3D QML QImage C++      更新时间:2023-10-16

我需要在 3D 场景中更改平面的纹理。在C++的后端类中,我制作了一个新的 QImage 来设置纹理。我想将其作为信号发送到我的 QML,并将其分配给平面材料属性。

但看起来TextureMaterial等只能使用纹理文件的URL路径。我无法将图像保存到硬盘驱动器以将其用作 URL 路径。太长了。我需要在一秒钟内更改我的纹理 20+ 次,并且该程序应该在同一时间内做其他事情。

有什么办法可以做到这一点吗?

你可以看看我在Qt3D中对背景图像的实现。

我实现您正在寻找的方法是使用类QTextureMaterialQTexture2DQPaintedTextureImage。我必须在绘制图像之前翻转图像,这就是我QPaintedTextureImage子类的原因,但这也可能正是您所需要的。而不是像我那样从磁盘加载纹理,您可以将子类上的QImage设置为属性。你只需要让C++类可用于QML并将其设置在你的飞机上(也许你甚至可以直接使用PaintedTextureImage,用他们的JavaScript风格的语言编写图像绘画)。

您可以将QPaintedTextureIage添加到QTexture2D,然后将结果设置为QTextureMaterial上的纹理。不过,我不确定这是否会产生最佳性能。

您也可以尝试遵循这些步骤,但它们似乎涉及更多。这意味着您必须实现自己的QAbstractTextureImage版本并返回相应的QTextureImageDataGeneratorPtr。您可以查看来源以更好地了解。