应用到 Qt3D 网格的图像文件中的纹理 (QTexture2D) 显示为纯灰色 - Python

问题描述 投票:0回答:1

我正在尝试将 jpg 文件中的纹理应用到网格(.obj 文件)。 这两个文件均来自 3D 扫描仪,可以在 3D 工具中打开并正确显示。

如何让 Qt3D 网格对象在查看器中正确显示,其纹理源自文件?

我创建一个网格并从 .obj 文件加载数据。 我创建一个纹理对象并从 .jpg 文件加载数据。 然后,我创建一个材质对象并将纹理与其关联。 然后该对象在可视化工具中显示为纯灰色。 这是代码片段。我还设置了一个 QPointLight (代码未显示)。

# Root entity.
self.rootEntity = QEntity()

# obj
filepath1 = "some_3D_file.obj"
texture_filepath1 = "some_image_file.jpg"

mesh_entity = QEntity(self.rootEntity)
mesh_object = Qt3DRender.QMesh()
mesh_object.setSource(QtCore.QUrl.fromLocalFile(filepath1))
mesh_entity.addComponent(mesh_object)

# Create texture
mesh_texture_image = Qt3DRender.QTextureImage(self.rootEntity)
mesh_texture_image.setSource(QtCore.QUrl.fromLocalFile(texture_filepath1))
mesh_texture_2D = Qt3DRender.QTexture2D(self.rootEntity)
mesh_texture_2D.addTextureImage(mesh_texture_image)

# Create material
mesh_material = QDiffuseSpecularMaterial(self.rootEntity)
mesh_material.setNormal(mesh_texture_2D)
mesh_material.setDiffuse(QColor(255, 255, 255, 0))
mesh_material.setSpecular(QColor(55, 55, 55, 0))

mesh_entity.addComponent(mesh_material)

我尝试了设置法线、漫反射和镜面反射的各种组合,使用加载的纹理和/或纯 QColor 值,但没有显示纹理图像。 看起来 setNormal 并没有做太多我用它做的事情。将 Qcolor 赋予 setDiffuse 会导致对象在查看器中显示相应的颜色(如预期)。

顺便问一下,为什么当我搜索 Qt3D 信息/问题/代码示例时结果这么少?我预计会有一个大型社区使用该模块。每个人都在使用我不知道的其他 3D 渲染器/可视化器模块吗?

感谢您的帮助。

3d pyqt textures qt3d
1个回答
0
投票

我认为困惑来自于您拥有的纹理类型以及如何将其与正确的 Qt3D 材质一起使用。

我假设你的纹理有颜色,它并不真正代表法线贴图。如果是这种情况,那么您需要使用 QDiffuseMapMaterial 来代替:

mesh_material = QDiffuseMapMaterial(self.rootEntity)
mesh_material.setDiffuse(mesh_texture_2D)
mesh_material.setAmbient(QColor(55, 55, 55, 0))

并确保为场景添加光源!

© www.soinside.com 2019 - 2024. All rights reserved.