与Panda3D文档语法一致时调用GeomVertexWriter/Rewriter报类型错误的原因?
问题原因
你遇到的报错本质是参数类型不匹配:GeomVertexWriter/GeomVertexRewriter的第二个参数要求为InternalName类型实例,你直接传入了Python字符串。GeomVertexReader的Python绑定做了字符串到InternalName的隐式转换,所以读取操作可以正常运行,但写操作的API没有做该隐式转换,因此触发类型错误。
部分旧版本Panda3D的Python绑定对写操作也做了隐式转换,因此你能找到的公开案例可以直接传字符串运行,新版本移除了这个非标准的隐式转换,就会触发报错。
解决方案
- 首先导入
InternalName类:
from panda3d.core import InternalName, Geom
- 将原来传入字符串的写法,替换为传入
InternalName实例:
# 错误写法 # vertex = GeomVertexRewriter(vdata, 'vertex') # 修正写法 vertex = GeomVertexRewriter(vdata, InternalName.get('vertex')) # 修改texcoord同理 # texcoord_writer = GeomVertexWriter(vdata, InternalName.get('texcoord'))
- 如果修改参数后仍提示不可写入,需要先解锁顶点数据:
默认加载的模型顶点数据是只读锁定的,修改前需要先设置为动态可修改模式并解锁:
# 设置为动态可修改模式 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
相关产品推荐
相关产品推荐

