我正在尝试将 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 渲染器/可视化器模块吗?
感谢您的帮助。
我认为困惑来自于您拥有的纹理类型以及如何将其与正确的 Qt3D 材质一起使用。
我假设你的纹理有颜色,它并不真正代表法线贴图。如果是这种情况,那么您需要使用 QDiffuseMapMaterial 来代替:
mesh_material = QDiffuseMapMaterial(self.rootEntity)
mesh_material.setDiffuse(mesh_texture_2D)
mesh_material.setAmbient(QColor(55, 55, 55, 0))
并确保为场景添加光源!