Multiple Meshes per Armature?

Is there a way to use multiple meshes/vertex-groups per armature?

I am attempting to use a Qubicle voxel model with its body parts broken up into compounds, I’ve tried three approaches so far:

  • Default approach:

    • Import compound (voxel model composed of voxel matrices) as a .OBJ/.FBX
    • Create an armature, and parent with automatic weights
    • Result: Some runtime error about being unable to find meshes (maybe because the meshes are vertex groups in this approach, and not separate objects?)
  • Contraints (Lock Location):

    • No errors, but I’m guessing constraints aren’t handled by Armory yet, as the body did not animate at all
  • Single mesh per Blender object (pic of this method below)

    • This is actually the closest to the effect I desire, as it does not deform the individual body parts, however it does not seem like Armatures actually translate individual meshes at all, instead I’m guessing the rotations are baked?

Either way, I’ve been overall unsuccessful. but it seems like a solution wouldn’t be far out of hand.

Result I’m getting:

My first reaction, if I understand the situation correctly, would be to join all the meshes into one object. An object in blender need not have all the elements attached to each other. Then use the armature.

expected result:image

This is the error trace I get most commonly:

"Cannot cast {
	object : Mesh Object Matrix, 
	oactions : [{
			objects : [{
					anim : <...>, 
					transform : <...>, 
					data_ref : <...>, 
					name : <...>, 
					type : <...>
				}]
		}], 
	isSkinned : false, 
	markerEvents : null, 
	lastFrameIndex : -1, 
	blendAction : , 
	blendCurrent : 0, 
	blendTime : 0, 
	paused : false, 
	onComplete : null, 
	frameIndex : 0, 
	loop : true, 
	speed : 1, 
	time : 1.1333333333333342, 
	action : MatrixAction, 
	frameTime : 0.03999999910593033, 
	oaction : {
		anim : {
			tracks : [{
					values : <...>, 
					target : <...>, 
					curve : <...>, 
					values_control_minus : <...>, 
					frames_control_plus : <...>, 
					frames : <...>, 
					values_control_plus : <...>, 
					frames_control_minus : <...>
				},{
					values : <...>, 
					target : <...>, 
					curve : <...>, 
					values_control_minus : <...>, 
					frames_control_plus : <...>, 
					frames : <...>, 
					values_control_plus : <...>, 
					frames_control_minus : <...>
				},{
					values : <...>, 
					target : <...>, 
					curve : <...>, 
					values_control_minus : <...>, 
					frames_control_plus : <...>, 
					frames : <...>, 
					values_control_plus : <...>, 
					frames_control_minus : <...>
				},{
					values : <...>, 
					target : <...>, 
					curve : <...>, 
					values_control_minus : <...>, 
					frames_control_plus : <...>, 
					frames : <...>, 
					values_control_plus : <...>, 
					frames_control_minus : <...>
				},{
					values : <...>, 
					target : <...>, 
					curve : <...>, 
					values_control_minus : <...>, 
					frames_control_plus : <...>, 
					frames : <...>, 
					values_control_plus : <...>, 
					frames_control_minus : <...>
				},{
					values : <...>, 
					target : <...>, 
					curve : <...>, 
					values_control_minus : <...>, 
					frames_control_plus : <...>, 
					frames : <...>, 
					values_control_plus : <...>, 
					frames_control_minus : <...>
				},{
					values : <...>, 
					target : <...>, 
					curve : <...>, 
					values_control_minus : <...>, 
					frames_control_plus : <...>, 
					frames : <...>, 
					values_control_plus : <...>, 
					frames_control_minus : <...>
				},{
					values : <...>, 
					target : <...>, 
					curve : <...>, 
					values_control_minus : <...>, 
					frames_control_plus : <...>, 
					frames : <...>, 
					values_control_plus : <...>, 
					frames_control_minus : <...>
				},{
					values : <...>, 
					target : <...>, 
					curve : <...>, 
					values_control_minus : <...>, 
					frames_control_plus : <...>, 
					frames : <...>, 
					values_control_plus : <...>, 
					frames_control_minus : <...>
				}], 
			end : 37, 
			begin : 0
		}, 
		transform : [], 
		data_ref : , 
		name : MatrixAction, 
		type : object
	}, 
	isSampled : false, 
	hx__closures__ : {
		0 : <function>, 
		1 : <function>
	}
} to {
	__name__ : true, 
	skinMaxBones : 20, 
	vpos : (2.4580337405204773, -4.521942853927612, -4.0643277168273935, 1), 
	vscl : (0.09716952592134476, 0.09716953337192669, 0.09716953337192664, 1), 
	q1 : 0.7071068387877083, 1.716648577772028e-15, 1.0536712986047686e-8, 0.7071067235853821, 
	q2 : 0.8690460685376744, -3.035705072611882, 0.1617916305981757, -0.8690462125341492, 
	vpos2 : (0, 0, 0, 1), 
	vscl2 : (0, 0, 0, 1), 
	wm : [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]
}"

It seems that I either get this error, or the models aren’t deformed at all by the bones (T-pose with z-axis as forward axis)

Also, it seems like parenting a mesh to an armature, deleting the mesh, then parenting a different mesh to that armature is problematic.

As I just attempted this with the running demo I had before (in the picture) and now it is giving me similar runtime errors to what I started with (which is above)

I don’t know if Armory supports attaching objects to armature bones, but this is a must have to attach equipment or weapons to characters, or make some golem with models attached to armature.

1 Like

It seems like Armature Actions are what’s causing the issue. I am able to parent just fine if the armature has no actions… which kind of makes an armature useless.

After removing armature actions the model happily jumps into T-Pose and starts facing the z axis (instead of the y axis) which to me seems to indicate that it is at least rotating with the armature (I’m guessing an armature with no axis defaults to facing the z axis vs. y axis)

Bump. I uploaded a repo of my different attempts to get this going.

I think this basically shows all of the errors I’ve run into so far.

Every blend file is the same setup more or less, some of them have runtime errors and some of them just deform the mesh strangely.