将图像作为十六进制文本嵌入到COLLADA文件中

时间:2018-08-08 14:23:26

标签: python xml collada 3d-modelling

我基本上是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的网站

COLLADA viewer

我在做什么错?我是否在解决这个问题的正确道路上?在花了1.5周的时间之后,我开始质疑它是否可行。有什么更好的办法吗? 感谢所有的支持。欢呼。

编辑:这是一个愚蠢的错误,我需要将解码器放入十六进制编码器中,例如base64.b64encode(<image>).decode

0 个答案:

没有答案