W3C home > Mailing lists > Public > www-style@w3.org > December 2011

Re: [css3-3d-transforms] rotations, changes needed...

From: L. David Baron <dbaron@dbaron.org>
Date: Wed, 7 Dec 2011 17:36:49 -0800
To: Chris Marrin <cmarrin@apple.com>
Cc: Matt Woodrow <mwoodrow@mozilla.com>, Daniel Glazman <daniel.glazman@disruptive-innovations.com>, www-style@w3.org
Message-ID: <20111208013649.GB32311@pickering.dbaron.org>
On Wednesday 2011-12-07 16:41 -0800, Chris Marrin wrote:
> On Dec 1, 2011, at 1:39 PM, L. David Baron wrote:
> > On Thursday 2011-12-01 13:24 -0800, Chris Marrin wrote:
> >> On Nov 29, 2011, at 12:13 PM, Matt Woodrow wrote:
> >>> This seems like the right interpretation to me, but I believe the matrix definition for rotate3d() in the spec needs to be updated to reflect this.
> >> 
> >> I'll look at it. What error(s) do you see?
> > 
> > Firefox implements the matrix definition of rotate3d that's given
> > in the spec, and everyone seems to agree that rotates in the wrong
> > direction.  Given that, I think the fix would be that all the terms
> > with sin(angle) should have their sign reversed.
> 
> How do you mean it rotates in the wrong direction? rotate(45deg) and rotate3d(0,0,1, 45deg) both rotate in the same direction, right?

Everyone is saying they should.  But according to the spec they
shouldn't, since:
  rotate(45deg)
   == (per SVG 1.1 explicitly, and also implicitly in CSS)
  matrix(cos(45deg), sin(45deg), -sin(45deg), cos(45deg), 0, 0)
   == (explicitly based on 3d-transforms)
  matrix3d(cos(45deg), sin(45deg), 0, 0,
           -sin(45deg), cos(45deg), 0, 0,
           0, 0, 1, 0,
           0, 0, 0, 1)

But according to css3-3d-transforms:
  rotate3d(0, 0, 1, 45deg)
   == (based on the definition of rotate3d())
  matrix3d(1 + (1-cos(45deg))*(0*0-1), -1*sin(45deg)+(1-cos(45deg))*0*0, 0*sin(45deg)+(1-cos(45deg))*0*1, 0,
           1*sin(45deg)+(1-cos(45deg))*0*0, 1 + (1-cos(45deg))*(0*0-1), -0*sin(45deg)+(1-cos(45deg))*0*1, 0,
           -0*sin(45deg)+(1-cos(45deg))*0*1, 0*sin(45deg)+(1-cos(45deg))*0*1, 1 + (1-cos(45deg))*(1*1-1), 0,
           0, 0, 0, 1)
   == (reducing)
  matrix3d(cos(45deg), -sin(45deg), 0, 0,
           sin(45deg), cos(45deg), 0, 0,
           0, 0, 1, 0,
           0, 0, 0, 1)

So I think the signs of all the sin(angle) terms in the definition
of rotate3d() need to be flipped, which is equivalent to transposing
the matrix.

(I could certainly see ending up the wrong way by accident given
confusion over which way matrix3d() describes a matrix and whether
it's for row vectors or column vectors.)

-David

-- 
𝄞   L. David Baron                         http://dbaron.org/   𝄂
𝄢   Mozilla                           http://www.mozilla.org/   𝄂
Received on Thursday, 8 December 2011 01:37:28 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:20:47 GMT