我基本上是3D建模的新手,所以请耐心等待我。我一直试图将图像作为纹理嵌入到.DAE文件中,以便可以在任何在线3D查看器中查看它。我正在使用Pycollada库创建XML树并编写.dae文件。以下是我生成的DAE文件的一部分
图片库
<library_images>
<image id="image1" name="image1">
<init_from>
<hex format="PNG">data:image/png;base64,{rest of the image}
</hex>
</init_from>
</image>
</library_images>
效果库
<library_effects>
<effect id="effect1" name="effect1">
<profile_COMMON>
<newparam sid="surface1">
<surface type="2D">
<init_from>image1</init_from>
<format>A8R8G8B8</format>
</surface>
</newparam>
<newparam sid="sampler2d">
<sampler2D>
<source>surface1</source>
</sampler2D>
</newparam>
<technique sid="common">
<lambert />
</technique>
<extra>
<technique profile="GOOGLEEARTH">
<double_sided>0</double_sided>
</technique>
</extra>
</profile_COMMON>
</effect>
</library_effects>
这是我的代码片段,用于将效果和图像添加到网格中
image = material.CImage('image1', '../test_images/a1.png', mesh)
surface = material.Surface('surface1', image)
sampler2d = material.Sampler2D('sampler2d', surface)
map = material.Map(sampler2d, 'TEX0')
inputs =('TEX0', 'TEXCOORD', '1')
material.Effect.supported = []
material.Effect.bumpmap = map
effect = material.Effect('effect1', [surface, sampler2d], 'lambert')
mat = material.Material('mat1', 'material', effect)
print('image: {}'.format(image.data))
mesh.effects.append(effect)
mesh.materials.append(mat)
mesh.images.append(image)
matNode = scene.MaterialNode('matNode1', mat, inputs=[inputs])
geoNode = scene.GeometryNode(geom, [matNode])
node1 = scene.Node('node1', [geoNode])
myscene = scene.Scene('myscene', [node1], collada=mesh)
mesh.scenes.append(myscene)
mesh.scene = myscene
mesh.write('test_newer.dae')
这最后一点还将图像十六进制数据添加到节点,并重写.dae文件以获取带有嵌入式图像的最终COLLADA文件。
data = str(image.data)
data = data.replace('b', '')
data = data.replace("'", "")
data = data.replace("\\n", "")
data = "data:image1/png;base64," + data #
tree = ElementTree.parse('test_newer.dae')
root = tree.getroot()
print('root: {}'.format(root[3][0][0]))
attrib = {'format': 'PNG'} #'id':'image-1', 'name':'image-1',
root[3][0].remove(root[3][0][0])
ElementTree.SubElement(root[3][0], 'init_from')
ElementTree.SubElement(root[3][0][0], 'hex', attrib)
root[3][0][0][0].text = data
print('tree: {}'.format(root[3][0].attrib))
tree.write('tester_newer.dae')
我仍然看不到带有Image作为纹理的结果结构。正在显示基本几何图形,只是缺少作为纹理的图像。顺便说一句,这是我用来查看COLLADA的网站
我在做什么错?我是否在解决这个问题的正确道路上?在花了1.5周的时间之后,我开始质疑它是否可行。有什么更好的办法吗? 感谢所有的支持。欢呼。
编辑:这是一个愚蠢的错误,我需要将解码器放入十六进制编码器中,例如base64.b64encode(<image>).decode