SVG animateMotion specification clarification request

Hi list,

I'm trying to work out the correct behaviour for the <animateMotion>
element as relates to other transforms on the same target element.
The specification is not 100% clear about the correct behaviour, and
if my reading is correct then at least one of the SVG Test files
(http://www.w3.org/Graphics/SVG/Test/20061213/htmlEmbedHarness/full-animate-elem-24-t.html)
is incorrect.

Here's the relevant part of the specification:

"The various (x,y) points of the shape provide a supplemental
transformation matrix onto the CTM for the referenced object which
causes a translation along the x- and y-axes of the current user
coordinate system by the (x,y) values of the shape computed over time.
Thus, the referenced object is translated over time by the offset of
the motion path relative to the origin of the current user coordinate
system. The supplemental transformation is applied on top of any
transformations due to the target element's ‘transform’ attribute or
any animations on that attribute due to ‘animateTransform’ elements on
the target element.

The ‘additive’ and ‘accumulate’ attributes apply to ‘animateMotion’
elements. Multiple ‘animateMotion’ elements all simultaneously
referencing the same target element can be additive with respect to
each other; however, the transformations which result from the
‘animateMotion’ elements are always supplemental to any
transformations due to the target element's ‘transform’ attribute or
any ‘animateTransform’ elements."

It's clear that the transformation matrix generated by animateMotion
elements (the supplemental transformation) is intended to be
independent of that generated by animateTransform elements and
'transform' attributes in the target element (the CTM).  The question
I have is whether the supplemental transformation is post-multiplied
onto the CTM or pre-multiplied.

The relevant wording is "The supplemental transformation is applied on
top of [the CTM]".  Unfortunately this isn't clear - elsewhere in the
specification there is a sense of postMultiply == concatenate ==
"applied after", but not "on top of".

The following example illustrates (I think) that the correct approach
is to postMultiply the supplemental transform:

<g transform="translate(300, 30)">
  <rect width="40" height="40" fill="green"></rect>
  <animateMotion dur="1s" repeatCount="1" rotate="auto" path="M
100,250 C 100,50 400,50 400,250"></animateMotion>
</g>

If we were to preMultiply the supplementalTransform, then the observed
path of the green rectangle varies wildly depending on whether
rotate="auto" is specified or not - with rotate="auto", the rectangle
appears to move along a path starting above the screen and rotating in
roughly a semicircle moving predominantly downwards, as the
supplementalTransform rotates as well as translates, and the rotation
in turn effects the translation component of the CTM.  On the other
hand, if the rotate attribute is not set to "auto", there is no
rotation component to the supplementalTransform and the rectangle
appears to move along a path starting at 400,280 (300,30 + 100,250)
and moving in roughly a semicircle moving predominantly to the right.

On the other hand, if we postMultiply the supplementalTransform then
the green rectangle always moves on the path starting at 400,280 and
moving to the right.  If rotate="auto" is set, then the rectangle
rotates as it moves along the path, which I think is more in keeping
with the intention of this attribute.

However, postMultiplying the supplementalTransform causes
animate-elem-24-t to render incorrectly.  The relevant part of this
file is:

<text id="TextElement" x="0" y="0" font-family="MyFont" font-size="20"
fill="#f22" transform="rotate(-30)">It's alive!
  <animateMotion path="M 0 0 L 50 180" begin="3s" dur="6s" fill="freeze"/>
  <animateTransform attributeName="transform" attributeType="XML"
type="rotate" from="-30" to="0" begin="3s" dur="6s" fill="freeze"/>
  <animateTransform attributeName="transform" attributeType="XML"
type="scale" from="1" to="3" additive="sum" begin="3s" dur="6s"
fill="freeze"/>
</text>

In this case, postMultiplying the supplementalTransform causes the
rotate and scale components of the CTM generated from the
animateTransform elements to effect the size of the translation
generated by the animateMotion - and this is clearly not expected by
the author of the test as the indicated expected positions of the text
at various times no long match the actual positions of the text.

So which is correct?

Cheers,
    -Shane

Received on Monday, 20 December 2010 05:00:09 UTC