Я хочу загрузить модель из файла .m3d с помощью программы «Noesis».С другого форума (я не очень хорошо разбираюсь в python) я получил фрагмент скрипта в качестве плагина для Noesis, который должен импортировать модель.Проблема в том, что я получаю следующую ошибку:
C:\Users\Username\Documents\NOESIS\plugins\python\fmt_swl_m3d.py
", line 42, in m3dLoadModel
nodeName=bs.readBytes(nodeNameSize).decode("ASCII")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd2 in position 2:
ordinal not in range(128)
Очевидно, что это как-то связано с частью декодирования, но если я изменю ее на "latin-1", "utf-8" или оставлю еепустой, он все равно выдаст ту же ошибку, или что-то вроде этого:
Сообщение об ошибке
Я не ожидаю какой-либо конкретной помощи, из-за используемой программы ибиблиотеки, но любое предложение о том, как решить эту проблему, очень помогло бы.Я пытался много часов, чтобы решить эту проблему ...
Заранее спасибо!
#Noesis Python model import+export test module, imports/exports some data
from/to a made-up format
from inc_noesis import *
import noesis
#rapi methods should only be used during handler callbacks
import rapi
#registerNoesisTypes is called by Noesis to allow the script to register
formats.
def registerNoesisTypes():
handle = noesis.register("Star Trek Legacy", ".m3d")
noesis.setHandlerTypeCheck(handle, m3dCheckType)
noesis.setHandlerLoadModel(handle, m3dLoadModel) #see also
noepyLoadModelRPG
#noesis.setHandlerWriteModel(handle, m3dWriteModel)
#noesis.setHandlerWriteAnim(handle, m3dWriteAnim)
#noesis.logPopup()
return 1
#check if it's this type based on the data
def m3dCheckType(data):
bs = NoeBitStream(data)
idMagic = bs.readBytes(8).decode("ASCII")
if idMagic != "Mad3D_SW":
return 0
return 1
#load the model
def m3dLoadModel(data, mdlList):
ctx = rapi.rpgCreateContext()
bs = NoeBitStream(data)
rapi.rpgSetOption(noesis.RPGOPT_TRIWINDBACKWARD, 1)
idMagic = bs.readBytes(8).decode("ASCII")
version = bs.readBytes(6)
meshCount = bs.readUShort()
for i in range(0, meshCount):
meshNameSize = bs.readUShort()
meshName = bs.readBytes(meshNameSize).decode("ASCII")
bs.seek(0x30, NOESEEK_REL)#mesh position?
#print(meshName)
nodeCount = bs.readUShort()
for i in range(0, nodeCount):
nodeNameSize = bs.readUShort()
nodeName = bs.readBytes(nodeNameSize).decode("ASCII")
count01 = bs.readUInt()
nodeType = bs.readUShort()
count02 = bs.readUInt()
nodeMatrix = bs.readBytes(0x30)
#print(nodeName)
if nodeType == 1:
nodeInfo = bs.read("H" * 7)
#print(nodeInfo)
vertBuff = bs.readBytes(12 * nodeInfo[3])
normalBuff = bs.readBytes(12 * nodeInfo[4])
uvBuff = bs.readBytes(8 * nodeInfo[5])
faceCount = bs.readUShort()
matNameSize = bs.readUShort()
matName = bs.readBytes(matNameSize).decode("ASCII")
texNameSize = bs.readUShort()
texName = bs.readBytes(texNameSize).decode("ASCII")
if nodeInfo[0] == 16:
bs.seek(0x1C, NOESEEK_REL)#null?
elif nodeInfo[0] == 18:
bs.seek(0x4, NOESEEK_REL)#null?
matNameSize1 = bs.readUShort()
matName1 = bs.readBytes(matNameSize1).decode("ASCII")
bs.seek(0x4, NOESEEK_REL)#null?
texNameSize1 = bs.readUShort()
texName1 = bs.readBytes(texNameSize1).decode("ASCII")
bs.seek(0x10, NOESEEK_REL)#null?
matNameSize2 = bs.readUShort()
matName2 = bs.readBytes(matNameSize2).decode("ASCII")
bs.seek(2, NOESEEK_REL)#null?
faceBuff = bs.readBytes(6 * faceCount)
faceCount2 = bs.readUInt()
faceBuff2 = bs.readBytes(6 * faceCount2)
if nodeInfo[0] == 18:
bs.seek(0x18 * nodeInfo[3], NOESEEK_REL)#weights?
bs.seek(0x18, NOESEEK_REL)#?
nodeInfo2 = bs.read("I" * 4)
faceBuff3 = bs.readBytes(2 * nodeInfo2[3])
rapi.rpgSetName(str(i))
rapi.rpgBindPositionBuffer(vertBuff, noesis.RPGEODATA_FLOAT, 12)
rapi.rpgBindNormalBuffer(normalBuff, noesis.RPGEODATA_FLOAT, 12)
rapi.rpgBindUV1Buffer(uvBuff, noesis.RPGEODATA_FLOAT, 8)
rapi.rpgCommitTriangles(faceBuff, noesis.RPGEODATA_USHORT,
faceCount * 3, noesis.RPGEO_TRIANGLE, 1)
bs.seek(3, NOESEEK_REL)#null?
#break
mdl = rapi.rpgConstructModel()
mdlList.append(mdl)
#print(bs.tell())
rapi.rpgClearBufferBinds()
return 1