Python 如何将材质应用于.glb/.gltf网格?

Python 如何将材质应用于.glb/.gltf网格?,python,gltf,trimesh,Python,Gltf,Trimesh,我有一个.glb格式的模型,场景中没有任何编辑(只有网格)。如何使用Python应用glb/gltf网格的材质?我正在使用Pygltflib和Trimesh,尽管我可以使用其他库。我只能给出一个一般性的答案,因为您没有提供任何代码,但原则上您会这样做: material = Material() # Create a material pbr = PbrMetallicRoughness() # Use PbrMetallicRoughness pbr.baseColorFactor = [1.

我有一个.glb格式的模型,场景中没有任何编辑(只有网格)。如何使用Python应用glb/gltf网格的材质?我正在使用Pygltflib和Trimesh,尽管我可以使用其他库。

我只能给出一个一般性的答案,因为您没有提供任何代码,但原则上您会这样做:

material = Material() # Create a material
pbr = PbrMetallicRoughness() # Use PbrMetallicRoughness
pbr.baseColorFactor = [1.0, 0.0, 0.0, 1.0] # solid red
material.pbrMetallicRoughness = pbr
在那之后,像那样为你的原始人提供材料

primitive.material = 0
别忘了将其添加到gltf中。与往常一样,如果您使用更多的材料,订单当然很重要:

gltf.materials.append(material)
为了完整起见,这里介绍了如何在三角形示例中添加带有“MASK”alphaMode的双面红色金属粗糙度材质,并将其另存为.glb:


当前gltf中是否有基本体/网格?是的,我有网格。如何将STL加载到pygltflib中?我正在尝试
mesh=GLTF2().load(my_path)
我收到错误
UnicodeDecodeError:“charmap”编解码器无法解码位置747中的字节0x90:character maps to
我认为此加载方法需要有效的gltf。我认为您无法加载这样的.stl。你为什么希望这能奏效?这是一种完全不同的格式。你应该能够用类似的东西读取.stl,然后相应地创建原语和顶点。如果您需要更多的指导,请随时提出另一个问题。我的问题发布在这里:
from pygltflib import *

# create gltf objects for a scene with a primitive triangle with indexed geometry
gltf = GLTF2()
scene = Scene()
mesh = Mesh()
material = Material()
primitive = Primitive()
node = Node()
buffer = Buffer()
bufferView1 = BufferView()
bufferView2 = BufferView()
accessor1 = Accessor()
accessor2 = Accessor()

# add data
buffer.uri = "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA="
buffer.byteLength = 44

bufferView1.buffer = 0
bufferView1.byteOffset = 0
bufferView1.byteLength = 6
bufferView1.target = ELEMENT_ARRAY_BUFFER

bufferView2.buffer = 0
bufferView2.byteOffset = 8
bufferView2.byteLength = 36
bufferView2.target = ARRAY_BUFFER

accessor1.bufferView = 0
accessor1.byteOffset = 0
accessor1.componentType = UNSIGNED_SHORT
accessor1.count = 3
accessor1.type = SCALAR
accessor1.max = [2]
accessor1.min = [0]

accessor2.bufferView = 1
accessor2.byteOffset = 0
accessor2.componentType = FLOAT
accessor2.count = 3
accessor2.type = VEC3
accessor2.max = [1.0, 1.0, 0.0]
accessor2.min = [0.0, 0.0, 0.0]

pbr = PbrMetallicRoughness() # Use PbrMetallicRoughness
pbr.baseColorFactor = [1.0, 0.0, 0.0, 1.0] # solid red
material.pbrMetallicRoughness = pbr
material.doubleSided = True # make material double sided
material.alphaMode = MASK   # to get around 'MATERIAL_ALPHA_CUTOFF_INVALID_MODE' warning

primitive.attributes.POSITION = 1
primitive.material = 0
node.mesh = 0
scene.nodes = [0]

# assemble into a gltf structure
gltf.scenes.append(scene)
gltf.meshes.append(mesh)
gltf.materials.append(material)
gltf.meshes[0].primitives.append(primitive)
gltf.nodes.append(node)
gltf.buffers.append(buffer)
gltf.bufferViews.append(bufferView1)
gltf.bufferViews.append(bufferView2)
gltf.accessors.append(accessor1)
gltf.accessors.append(accessor2)

gltf.convert_buffers(BufferFormat.BINARYBLOB) # Convert buffers to allow saving as .glb

# save to a .glb file
gltf.save("triangle.glb")