在Panda3D中用Python加载.gltf文件颜色不显示问题
问题:Panda3D加载GLTF模型仅显示网格,无法渲染颜色
我有一个GLTF模型,用Panda3D加载后能正常显示网格,但模型的颜色完全不渲染。不过把这个模型导入Blender,手动设置颜色属性并关联到基础色后,就能正常显示网格和对应的颜色。
我目前的代码如下:
from panda3d.core import AmbientLight, DirectionalLight, Vec3, Vec4 from direct.showbase.ShowBase import ShowBase import simplepbr class MyApp(ShowBase): def __init__(self): ShowBase.__init__(self) simplepbr.init() self.environ = self.loader.loadModel("models/output_file.gltf") self.environ.reparentTo(self.render) self.environ.setPos(0, 0, 0) # 创建方向光并设置方向 dlight = DirectionalLight('dlight') dlight.setColor(Vec4(1, 1, 1, 1)) dlight.setDirection(Vec3(-1, -1, -1)) # 将灯光添加到渲染节点 dlnp = self.render.attach_new_node(dlight) self.render.set_light(dlnp) # 添加环境光 alight = AmbientLight('alight') alight.setColor(Vec4(0.2, 0.2, 0.2, 1)) alnp = self.render.attach_new_node(alight) self.render.set_light(alnp) app = MyApp() app.run()
我试过不使用simplepbr直接加载,结果一样;也尝试过把模型转换成egg、obj、ply等格式,最终显示的都是灰色模型。
解决方案:启用顶点颜色渲染
问题核心是Panda3D默认未启用顶点颜色渲染支持,而你的模型颜色数据存储在顶点颜色通道中。可以通过以下方式修复:
1. 用simplepbr直接启用顶点颜色
在初始化simplepbr时添加use_vertex_colors=True参数,快速开启顶点颜色渲染:
simplepbr.init(use_vertex_colors=True)
2. 手动遍历节点强制启用顶点颜色材质
如果上述方法无效,可手动遍历模型的所有几何体节点,为每个几何体设置启用顶点颜色的材质:
from panda3d.core import Material # 加载模型后添加这段代码 for geom_node in self.environ.find_all_matches("**/+GeomNode"): geom_node_obj = geom_node.node() for i in range(geom_node_obj.get_num_geoms()): geom = geom_node_obj.get_geom(i) vdata = geom.get_vertex_data() # 检查是否存在颜色通道 if vdata.has_column("color"): mat = Material() mat.set_vertex_color(True) geom_node_obj.set_material(mat, i)
完整修改后的代码
from panda3d.core import AmbientLight, DirectionalLight, Vec3, Vec4, Material from direct.showbase.ShowBase import ShowBase import simplepbr class MyApp(ShowBase): def __init__(self): ShowBase.__init__(self) # 初始化simplepbr并启用顶点颜色 simplepbr.init(use_vertex_colors=True) self.environ = self.loader.loadModel("models/output_file.gltf") self.environ.reparentTo(self.render) self.environ.setPos(0, 0, 0) # 手动确保几何体启用顶点颜色材质 for geom_node in self.environ.find_all_matches("**/+GeomNode"): geom_node_obj = geom_node.node() for i in range(geom_node_obj.get_num_geoms()): geom = geom_node_obj.get_geom(i) vdata = geom.get_vertex_data() if vdata.has_column("color"): mat = Material() mat.set_vertex_color(True) geom_node_obj.set_material(mat, i) # 灯光设置 dlight = DirectionalLight('dlight') dlight.setColor(Vec4(1, 1, 1, 1)) dlight.setDirection(Vec3(-1, -1, -1)) dlnp = self.render.attach_new_node(dlight) self.render.set_light(dlnp) alight = AmbientLight('alight') alight.setColor(Vec4(0.2, 0.2, 0.2, 1)) alnp = self.render.attach_new_node(alight) self.render.set_light(alnp) app = MyApp() app.run()
补充说明
- 你的模型颜色数据应该存储在顶点的
COLOR_0通道中,Blender会自动识别并关联到基础色,但Panda3D需要显式启用顶点颜色渲染。 - 如果模型颜色存储在自定义属性而非标准顶点颜色通道,可在Blender中将自定义属性转换为标准顶点颜色后再导出GLTF,或通过代码映射该属性到颜色通道。
内容的提问来源于stack exchange,提问作者Ivan Viti
相关产品推荐
相关产品推荐

