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

与Panda3D文档语法一致时调用GeomVertexWriter/Rewriter报类型错误的原因?

问题原因

你遇到的报错本质是参数类型不匹配:GeomVertexWriter/GeomVertexRewriter的第二个参数要求为InternalName类型实例,你直接传入了Python字符串。GeomVertexReader的Python绑定做了字符串到InternalName的隐式转换,所以读取操作可以正常运行,但写操作的API没有做该隐式转换,因此触发类型错误。

部分旧版本Panda3D的Python绑定对写操作也做了隐式转换,因此你能找到的公开案例可以直接传字符串运行,新版本移除了这个非标准的隐式转换,就会触发报错。

解决方案

  1. 首先导入InternalName类:
from panda3d.core import InternalName, Geom
  1. 将原来传入字符串的写法,替换为传入InternalName实例:
# 错误写法
# vertex = GeomVertexRewriter(vdata, 'vertex')
# 修正写法
vertex = GeomVertexRewriter(vdata, InternalName.get('vertex'))

# 修改texcoord同理
# texcoord_writer = GeomVertexWriter(vdata, InternalName.get('texcoord'))
  1. 如果修改参数后仍提示不可写入,需要先解锁顶点数据:
    默认加载的模型顶点数据是只读锁定的,修改前需要先设置为动态可修改模式并解锁:
# 设置为动态可修改模式
vdata.set_usage(Geom.U_dynamic)
# 解锁顶点数据
vdata.unlock()

完整可运行示例

from panda3d.core import GeomVertexRewriter, InternalName, Geom

# 先处理vdata的可修改属性
vdata.set_usage(Geom.U_dynamic)
vdata.unlock()

# 初始化Rewriter修改顶点坐标
vertex = GeomVertexRewriter(vdata, InternalName.get('vertex'))
while not vertex.isAtEnd():
    v = vertex.getData3()
    # 示例:将所有顶点的Z轴坐标设为0
    vertex.setData3(v[0], v[1], 0.0)

内容的提问来源于stack exchange,提问作者Emma N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:15:04