Re: [cgkit-user] confusion over cg-kit's mat4 format
Brought to you by:
mbaas
|
From: Matthias B. <mat...@gm...> - 2011-04-03 17:59:25
|
Hi Nathaniel, it seems you got it all working now, but just to recap: Whenever you deal with separate packages that use matrices to store transformations, you need to check what their conventions are with respect to how points are transformed. You can transform them by either multiplying them to the left or the right of the matrix: 1) Maya: transformedPoint = point*Matrix (in this case, the translation part is the 4th *row* of the matrix) 2) cgkit: transformedPoint = Matrix*point (in this case, the translation part is the 4th *column* of the matrix) It's straightforward to switch from one convention to the other, you just have to transpose the matrix. If those packages store matrices as flat lists instead of dedicated matrix objects, then there's an additional stumbling block. You need to know the order of the values, they are either in column-major or row-major order (which has nothing to do with the above convention about the order of the multiplication). If you get this wrong, you end up having a transposed matrix. If you get both things wrong (the above transformation convention and the value ordering), you are actually fine again as one mistake cancels out the other one (which may actually further increase the confusion). > def cgkit_matrix( xform_list ): > """ > takes a 16 element list (assumed to be the result of a xform query) > and returns a cgkit.cgtypes.mat4 in proper form > """ > matrix = cgkit.cgtypes.mat4( xform_list ) > matrix = matrix.transpose( ) > return matrix That looks correct to me. > def maya_xform_list( matrix ): > """ > converts a cgkit.cgtypes.mat4 into a row list that can be used with > mays.cmds.xform. > The original matrix is left unaltered. > """ > #create a copy of the original matrix > matrix = cgkit.cgtypes.mat4( matrix ) > matrix = matrix.transpose( ) > return matrix.toList( rowmajor = True ) The transpose() method returns a copy anyway, so there's no need to copy the matrix at the beginning. Also note that this function could even be far simpler, you could just return matrix.toList() (using the default column-major order) in which case the transpose will be done implicitly by toList(). - Matthias - |