- From: Johannes Behr <johannes.behr@igd.fraunhofer.de>
- Date: Fri, 13 Jan 2012 16:49:40 +0100
- To: Dean Jackson <dino@apple.com>
- Cc: public-fx@w3.org, igor.oliveira@openbossa.org, public-d3d mlist <public-declarative3d@w3.org>, Timm Drevensek <timm.drevensek@igd.fraunhofer.de>
Before going into more details: Was there a good reason for just a single matrix interface and not a minimalistic but useful set of base types (e.g. Vec3, Vec4, Matrix4x4 or even Quaternion) which would be really helpful for various math related operations (e.g composition/decomposition)? We (especially Timm) thought about something similar for the dec3d group: http://www.w3.org/community/declarative3d/wiki/Base_Types
best regards
johannes
> [Apologies if this mail comes out badly formatted - I'm using a crappy web mail app]
>
> This is picking up from Igor's proposal [1] and completes my action (given at the W3C TP) to propose a more "native" matrix class.
>
> Open questions:
>
> - should include ortho() and perspective() functions? (suggestion: YES)
> - should include a matrix decomposition method? (suggestion: YES)
> - should include a lookAt() method? (suggestion: PROBABLY, requires vectors or multiple parameters)
> - ok to remove skew? (suggestion: I HOPE SO)
>
>
> // -----------------------------------------------------------------------
> // CONSTRUCTORS
> // -----------------------------------------------------------------------
>
> [
> // Creates an identity matrix
> Constructor(),
>
> // Creates a new matrix from the value passed in (which is CSS transform string with
> // matrix() or matrix3d() - not other functions).
> Constructor(in DOMString string),
>
> // Creates a new matrix from the Float32Array value passed in (length of 6 for a 2d matrix, or 16 for a 4x4 matrix).
> Constructor(in Float32array array),
>
> // Creates a new matrix identical to the passed matrix.
> Constructor(in Matrix4x4 matrix),
>
> // Creates a new matrix from the array of 6 or 16 values passed in
> Constructor(in sequence<float> array)
> ]
>
> interface Matrix4x4 {
>
> // These attributes are simple aliases for certain elements of the 4x4 matrix
> attribute double a; // alias for m11
> attribute double b; // alias for m12
> attribute double c; // alias for m21
> attribute double d; // alias for m22
> attribute double e; // alias for m41
> attribute double f; // alias for m42
>
> attribute double m11;
> attribute double m12;
> attribute double m13;
> attribute double m14;
> attribute double m21;
> attribute double m22;
> attribute double m23;
> attribute double m24;
> attribute double m31;
> attribute double m32;
> attribute double m33;
> attribute double m34;
> attribute double m41;
> attribute double m42;
> attribute double m43;
> attribute double m44;
>
> // -----------------------------------------------------------------------
> // TRANSFORMATION FUNCTIONS
> // -----------------------------------------------------------------------
>
> // Multiply itself by a otherMatrix, on the right (this = this * otherMatrix)
> void multiply(in Matrix4x4 otherMatrix);
>
> // Multiply this matrix by otherMatrix, on the right (result = this * otherMatrix)
> [Immutable] Matrix4x4 multipliedBy(in Matrix4x4 otherMatrix);
>
> // Multiply itself by a otherMatrix, on the left (this = otherMatrix * this)
> void leftMultiply(in Matrix4x4 otherMatrix);
>
> // Invert this matrix. Throw an exception if the matrix is not invertible
> void invert() raises (DOMException)
>
> // Return the inverse of this matrix. Throw an exception if the matrix is not invertible
> [Immutable] Matrix4x4 inverseMatrix() raises (DOMException);
>
> // Translate this matrix in place using the passed values.
> // Undefined or NaN parameters will use a value of 0. This allows the 3D form to used for 2D operations.
> void translate(in double x,
> in double y,
> in double z);
>
> // Return a new matrix that is this matrix translated by the passed values.
> // Undefined or NaN parameters will use a value of 0. This allows the 3D form to used for 2D operations
> [Immutable] Matrix4x4 translatedBy(in double x,
> in double y,
> in double z);
>
> // Scale this matrix in place using the passed values.
> // Passing undefined or NaN for scaleY uses the value of scaleX.
> // Passing undefined or NaN for scaleZ uses the value 1.0.
> void scale(in double scaleX,
> in double scaleY,
> in double scaleZ);
>
> // Return a new matrix that is this matrix scaled by the passed values.
> // Passing undefined or NaN for scaleY uses the value of scaleX.
> // Passing undefined or NaN for scaleZ uses the value 1.0.
> [Immutable] Matrix4x4 scaledBy(in double scaleX,
> in double scaleY,
> in double scaleZ);
>
> // Rotate this matrix in place using the passed values. Each parameter defines
> // an angle of rotation around the (corresponding) X, Y or Z axes.
> // Passing undefined or NaN for rotY and rotZ instead rotates around the Z axis
> // (i.e. rotX = 0, rotY = 0, rotZ = <input rotX>)
> // Input values are in radians.
> void rotate(in double rotX,
> in double rotY,
> in double rotZ);
>
> // Return a new matrix that is this matrix rotated by the passed values. Each parameter
> // defines an angle of rotation around the (corresponding) X, Y or Z axes.
> // Passing undefined or NaN for rotY and rotZ instead rotates around the Z axis
> // (i.e. rotX = 0, rotY = 0, rotZ = <input rotX>)
> // Input values are in radians.
> [Immutable] Matrix4x4 rotatedBy(in double rotX,
> in double rotY,
> in double rotZ);
>
> // Rotate this matrix in place using the passed values. The x, y and z values
> // define a vector about which the matrix is rotated.
> // The value of angle is in radians.
> void rotateAxisAngle(in double x,
> in double y,
> in double z,
> in double angle);
>
> // Return a new matrix that is this matrix rotated using the passed values. The x, y and z values
> // define a vector about which the matrix is rotated.
> // The value of angle is in radians.
> [Immutable] Matrix4x4 rotatedByAxisAngle(in double x,
> in double y,
> in double z,
> in double angle);
>
> // -----------------------------------------------------------------------
> // CONVERSION FUNCTIONS
> // -----------------------------------------------------------------------
>
> // Copy the matrix elements into a Float32Array
> // Throws an exception if the input is invalid (e.g. wrong length, etc).
> void copyIntoFloat32Array(inout Float32Array array) raises (DOMException);
>
> // return a Float32Array (length 16) with the values [m11, m12, ...]
> Float32Array toFloat32Array();
>
> // Returns a string that is in the format of a CSS transform.
> // (e.g. "matrix3d(m11, m12, ...)")
> DOMString toString();
> };
>
>
>
>
> [1] http://lists.w3.org/Archives/Public/public-webapps/2011OctDec/0376.html
--
Dr. Johannes Behr
Abteilungsleiter Visual Computing System Technologies
Fraunhofer-Institut für Graphische Datenverarbeitung IGD
Fraunhoferstr. 5 | 64283 Darmstadt | Germany
Tel +49 6151 155-510 | Fax +49 6151 155-196
johannes.behr@igd.fraunhofer.de | www.igd.fraunhofer.de
Received on Friday, 13 January 2012 15:51:09 UTC