Alembic: always export transforms as inheriting

Blender now always exports transforms as as "inheriting", as Blender has
no concept of parenting without inheriting the transform.

Previously only objects with an actual parent were marked as
"inheriting", and parentless objects as "non-inheriting". However,
certain packages (for example USD's Alembic plugin) are incompatible
with non-inheriting transforms and will completely ignore such
transforms, placing all such objects at the world origin.

When importing non-inheriting transforms from Alembic, Blender will
break the parent-child relation and thus force the child to (correctly)
interpret the transform as world matrix.
This commit is contained in:
Sybren A. Stüvel 2020-06-19 10:24:57 +02:00
parent f106369ce8
commit 2dff08c8ce
2 changed files with 8 additions and 3 deletions

View File

@ -97,7 +97,12 @@ void AbcTransformWriter::do_write()
m_matrix = convert_matrix_datatype(yup_mat);
m_sample.setMatrix(m_matrix);
m_sample.setInheritsXforms(m_inherits_xform);
/* Always export as "inherits transform", as this is the only way in which Blender works. The
* above code has already taken care of writing the correct matrix so that this option is not
* necessary. However, certain packages (for example the USD Alembic exporter) are incompatible
* with non-inheriting transforms and will completely ignore the transform if that is used. */
m_sample.setInheritsXforms(true);
m_schema.set(m_sample);
}

View File

@ -194,7 +194,7 @@ class HierarchicalAndFlatExportTest(AbstractAlembicTest):
# Now check the resulting Alembic file.
xform = self.abcprop(abc, '/Cube_012/.xform')
self.assertEqual(0, xform['.inherits'])
self.assertEqual(1, xform['.inherits'], "Blender transforms always inherit")
self.assertAlmostEqualFloatArray(
xform['.vals'],
@ -233,7 +233,7 @@ class DupliGroupExportTest(AbstractAlembicTest):
# Now check the resulting Alembic file.
xform = self.abcprop(abc, '/Suzanne/.xform')
self.assertEqual(0, xform['.inherits'])
self.assertEqual(1, xform['.inherits'])
self.assertAlmostEqualFloatArray(
xform['.vals'],