Re: [css3-transforms] rendering of objects transformed with non-invertable matrix

On Apr 22, 2012, at 9:14 AM, Dr. Olaf Hoffmann wrote:

> Hello,  
> 
> this is about:
> http://www.w3.org/TR/2012/WD-css3-transforms-20120403/#animation
> 
> In the last paragraph of 15. it is mentioned:
> [In some cases, an animation might cause a transformation matrix to be 
> singular or non-invertible. For example, an animation in which scale moves 
> from 1 to -1. At the time when the matrix is in such a state, the transformed 
> element is not rendered.]
> 
> Because SVG tiny 1.2 has and maybe future versions of SVG will 
> have the property vector-effect="non-scaling-stroke", it is a real use 
> case to have objects, transformed to 1D or 0D objects, which remain 
> visible, for example with this one can create a simple presentation of 
> an 1D harmonic oscillator, using rotation, one direction transformed to
> zero.
> 
> Therefore I think, it is not a good idea to say that the object is not
> rendered, because this will not be the effect intended by the author
> and there is no simple workaround to get the same effect with
> another method.
SVG 2 will have the 'non-scaling-stroke' feature. And I am working on a possible issue with 'non-scaling-stroke' and 3D transforms [1]. 

Anyway. How do you want to draw a figure on a singular matrix? You can't draw the figure, so the value of 'vector-effect' doesn't matter at all:

<svg xmlns="http://www.w3.org/2000/svg">
  <rect width="100" height="100" vector-effect="non-scaling-stroke" transform="scale(0)" stroke-width="100" stroke="black" fill="none"/>
</svg>

In this example the transform of the rect has a singular matrix, caused by scaling by the factor of 0. Therefore the figure can't get painted at all. How can 'non-scaling-stroke' make a difference here?
It doesn't even matter if the ancestor node had this transform:


<svg xmlns="http://www.w3.org/2000/svg">
  <g  transform="scale(0)">
    <rect width="100" height="100" vector-effect="non-scaling-stroke" stroke-width="100" stroke="black" fill="none"/>
  </g>
</svg>

You can verify it in all current browsers with 'non-sclaing-stroke support' (Opera, Safari, Chrome) and Batik. At least from an implementation point of view you want the local to root transform to be invertible.

> 
> Indeed, because for animation there is no need to invert a matrix
> at all - the problem with the inversions seem to be only an artifact
> of 16.1., not related to the intended animation effect, I suggest to
> skip this paragraph.  For example, nothing specific happens at 0,
> if one scales from 1 to -1 - there is no reason not to render the 
> object continuously for such an animation.
Browsers use a different approach: quaternions [2]. I'll try to update this paragraph in the next days. But even so, what do you want to draw on scale(0)?

> 
> Maybe this is already an indication, that 16.1 should be improved,
> if it introduces problems, that have nothing to do with the intended
> animation effect (it is a well known thing, that one should avoid 
> numerical matrix inversion, if possible; the inversion algorithm may
> already cause trouble around the situation, where it becomes
> non-invertable, resulting in funny numerical artifacts) ...
> 
> 
> 
> Best wishes
> 
> Olaf
> 
> 
> 

Greetings,
Dirk

[1] http://lists.w3.org/Archives/Public/public-fx/2012JanMar/0173.html
[2] https://www.w3.org/Bugs/Public/show_bug.cgi?id=15960

Received on Sunday, 22 April 2012 17:45:27 UTC