You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:45:35