Can I load an armature without a mesh?

Hello,

I want to import an armature without a mesh. I created a simple animation in Blender 2.67b (I tried it in Blender 3 too)

simple-animation

I exported it to COLLADA with settings:

I try to load it:

    result = await loader.loadAsync("assets/jill/bones-armature.dae");
    const armature = result.scene;
    const clips = armature.animations;
    console.log(clips);

But I have this error in the browser console:

image

bones-armature.dae

<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
  <asset>
    <contributor>
      <author>Blender User</author>
      <authoring_tool>Blender 2.67.0 r57141</authoring_tool>
    </contributor>
    <created>2022-06-24T21:03:25</created>
    <modified>2022-06-24T21:03:25</modified>
    <unit name="meter" meter="1"/>
    <up_axis>Z_UP</up_axis>
  </asset>
  <library_images/>
  <library_animations>
    <animation id="Armature_Bone_pose_matrix">
      <source id="Armature_Bone_pose_matrix-input">
        <float_array id="Armature_Bone_pose_matrix-input-array" count="3">0.04166662 2.083333 4.166666</float_array>
        <technique_common>
          <accessor source="#Armature_Bone_pose_matrix-input-array" count="3" stride="1">
            <param name="TIME" type="float"/>
          </accessor>
        </technique_common>
      </source>
      <source id="Armature_Bone_pose_matrix-output">
        <float_array id="Armature_Bone_pose_matrix-output-array" count="48">1 0 0 0 0 7.54979e-8 -1 0 0 1 7.54979e-8 0 0 0 0 1 1 0 0 0 0 7.54979e-8 -1 1.965258 0 1 7.54979e-8 0 0 0 0 1 1 0 0 0 0 7.54979e-8 -1 1.10677e-15 0 1 7.54979e-8 1.46596e-8 0 0 0 1</float_array>
        <technique_common>
          <accessor source="#Armature_Bone_pose_matrix-output-array" count="3" stride="16">
            <param name="TRANSFORM" type="float4x4"/>
          </accessor>
        </technique_common>
      </source>
      <source id="Armature_Bone_pose_matrix-interpolation">
        <Name_array id="Armature_Bone_pose_matrix-interpolation-array" count="3">LINEAR LINEAR LINEAR</Name_array>
        <technique_common>
          <accessor source="#Armature_Bone_pose_matrix-interpolation-array" count="3" stride="1">
            <param name="INTERPOLATION" type="name"/>
          </accessor>
        </technique_common>
      </source>
      <sampler id="Armature_Bone_pose_matrix-sampler">
        <input semantic="INPUT" source="#Armature_Bone_pose_matrix-input"/>
        <input semantic="OUTPUT" source="#Armature_Bone_pose_matrix-output"/>
        <input semantic="INTERPOLATION" source="#Armature_Bone_pose_matrix-interpolation"/>
      </sampler>
      <channel source="#Armature_Bone_pose_matrix-sampler" target="Bone/transform"/>
    </animation>
    <animation id="Armature_Bone_001_pose_matrix">
      <source id="Armature_Bone_001_pose_matrix-input">
        <float_array id="Armature_Bone_001_pose_matrix-input-array" count="3">0.04166662 2.083333 4.166666</float_array>
        <technique_common>
          <accessor source="#Armature_Bone_001_pose_matrix-input-array" count="3" stride="1">
            <param name="TIME" type="float"/>
          </accessor>
        </technique_common>
      </source>
      <source id="Armature_Bone_001_pose_matrix-output">
        <float_array id="Armature_Bone_001_pose_matrix-output-array" count="48">1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1</float_array>
        <technique_common>
          <accessor source="#Armature_Bone_001_pose_matrix-output-array" count="3" stride="16">
            <param name="TRANSFORM" type="float4x4"/>
          </accessor>
        </technique_common>
      </source>
      <source id="Armature_Bone_001_pose_matrix-interpolation">
        <Name_array id="Armature_Bone_001_pose_matrix-interpolation-array" count="3">LINEAR LINEAR LINEAR</Name_array>
        <technique_common>
          <accessor source="#Armature_Bone_001_pose_matrix-interpolation-array" count="3" stride="1">
            <param name="INTERPOLATION" type="name"/>
          </accessor>
        </technique_common>
      </source>
      <sampler id="Armature_Bone_001_pose_matrix-sampler">
        <input semantic="INPUT" source="#Armature_Bone_001_pose_matrix-input"/>
        <input semantic="OUTPUT" source="#Armature_Bone_001_pose_matrix-output"/>
        <input semantic="INTERPOLATION" source="#Armature_Bone_001_pose_matrix-interpolation"/>
      </sampler>
      <channel source="#Armature_Bone_001_pose_matrix-sampler" target="Bone_001/transform"/>
    </animation>
  </library_animations>
  <library_controllers/>
  <library_visual_scenes>
    <visual_scene id="Scene" name="Scene">
      <node id="Armature" name="Armature" type="NODE">
        <translate sid="location">0 0 0</translate>
        <rotate sid="rotationZ">0 0 1 0</rotate>
        <rotate sid="rotationY">0 1 0 0</rotate>
        <rotate sid="rotationX">1 0 0 0</rotate>
        <scale sid="scale">1 1 1</scale>
        <node id="Bone" name="Bone" sid="Bone" type="JOINT">
          <matrix sid="transform">1 0 0 0 0 7.54979e-8 -1 0 0 1 7.54979e-8 0 0 0 0 1</matrix>
          <node id="Bone_001" name="Bone.001" sid="Bone_001" type="JOINT">
            <matrix sid="transform">1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1</matrix>
          </node>
        </node>
      </node>
    </visual_scene>
  </library_visual_scenes>
  <scene>
    <instance_visual_scene url="#Scene"/>
  </scene>
</COLLADA>

I think mostly this will depend on the authoring tool, exporter, and file format. I have no idea if COLLADA supports this or if Blender’s exporter has implemented it.

Based on this thread it looks like Blender 3.2 can export an armature without a mesh to glTF. That’s what I’d try, we recommend using glTF when possible anyway. But I haven’t tried exporting an armature alone yet.

I have another armature that I created by my Python script in Blender 2.67b. This script loads the original animation data of Resident Evil character from files created with RE1MV. This is a result of my script:

jill-animation-in-blender

I loaded this animation in my program in pure WebGL:

jill-animations-webgl-ts-compressed-4mb

Now I try to load it to Three.js and it works:

    result = await loader.loadAsync("assets/jill/jill-armature.dae");
    const armature = result.scene;
    const clips = armature.animations;
    console.log(clips);

image

But I do not understand how it works and what I should do with this data. I decided to load only one bone animation to understand how it works, but it does not work with one bone animation.