Screenshot instructions:
Windows
Mac
Red Hat Linux
Ubuntu
Click URL instructions:
Rightclick on ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)
From: Nathaniel Albright <nathanieljla@gm...>  20110401 21:11:01
Attachments:
Message as HTML

Hello to whoever may see this (if I'm even doing this right. this is my first time using a mailing list), I'm attempting to use cgkit with Maya for some app specific transform manipulation as well as for animation exporting/importing. However, after a number of hours (more than I'd care to admit) I've only had limit success. Most of this confusion has come from the way cgkit and Maya represent their matrices. Since any queries in maya for an object's xform result in a list of elements in row order, and cgkit requests the data in row order I wouldn't expect the issues I'm currently having. For example, if I pass cgkit the maya_list and then immediately call decompose() translation is returned. Initially this left me to believe cgkit must be columnMajor ( especially since the toList() returns the results as columns by default ). As such I did a transpose() on the matrix before the decompose() and as expected I then had my proper transform values. Unfortunately I've since determined that this isn't the proper answer to my issue. While the transpose worked well for getting what I need out of decompose, it created incorrect results for manipulating the data and then setting the results back into Maya. I've only successfully been able to manipulate my cgkit objects and plot the data back into Maya when I DON'T do any transpose....I'm using toList( rowmajor = True ). However as mentioned then the decompose() function isn't correct. I could ramble with all the ways I've been confused, however I think I just need some clarification. From what I can gather in the document the translation value is embedded as the forth element of the three axises. for example: a_list = [ v1.x, v1.y, v1.z, t.x, v2.x, v2.y, v2.z, t.y, v3.x, v3.y, v3.z, t.z, v4.x, v4.y, v4.z, t.w, ] is this correct? I was expecting it to be: b_list = [ v1.x, v1.y, v1.z, v1.w, v2.x, v2.y, v2.z, v2.w, v3.x, v3.y, v3.z, v3.w, t.x, t.y, t.z, t.w, ] as such, I wrote a transpose_translation() which as the name suggests swaps out the last row and column so that a mat4 initialized with a b_list results in the expected a_list form. Unfortunately with this method I'm back to square one, where the decompose works, but any math operations result in correct answers. It seems as if when the transform is in the last row everything math wise works, but cgkit is expecting it in the last column...where my math operations don't work. Does anyone have any tips on what I'm doing wrong or gotten things to work between Maya and the cgkit? Thanks in advance, Nathaniel 
From: Nathaniel Albright <nathanieljla@gm...>  20110401 22:00:40
Attachments:
Message as HTML

Errr. I hope I'm replying to my own email correctly. If not I apologize. It turns out P.E.B.K.A.C. Sadly as I wrote my previous email I continued to say to myself, "this must be column major and my code isn't handling that right". I guess between transposing() to and from maya, as well as my options for asList(), different order of operations, and on top of refamiliarizing myself with Maya I just did it wrong...a lot of different ways. I think one time I forgot to transpose back, another time I forgot to switch my order of operation, and who knows the 12+ other times :) 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 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 ) Cool lib b.t.w. On Fri, Apr 1, 2011 at 4:10 PM, Nathaniel Albright <nathanieljla@...>wrote: > Hello to whoever may see this (if I'm even doing this right. this is my > first time using a mailing list), > > I'm attempting to use cgkit with Maya for some app specific transform > manipulation as well as for animation exporting/importing. However, after a > number of hours (more than I'd care to admit) I've only had limit success. > Most of this confusion has come from the way cgkit and Maya represent their > matrices. Since any queries in maya for an object's xform result in a list > of elements in row order, and cgkit requests the data in row order I > wouldn't expect the issues I'm currently having. > > For example, if I pass cgkit the maya_list and then immediately call > decompose() translation is returned. Initially this left me to believe > cgkit must be columnMajor ( especially since the toList() returns the > results as columns by default ). As such I did a transpose() on the matrix > before the decompose() and as expected I then had my proper transform > values. > > Unfortunately I've since determined that this isn't the proper answer to my > issue. While the transpose worked well for getting what I need out of > decompose, it created incorrect results for manipulating the data and then > setting the results back into Maya. I've only successfully been able to > manipulate my cgkit objects and plot the data back into Maya when I DON'T do > any transpose....I'm using toList( rowmajor = True ). However as mentioned > then the decompose() function isn't correct. > > I could ramble with all the ways I've been confused, however I think I just > need some clarification. From what I can gather in the document the > translation value is embedded as the forth element of the three axises. for > example: > a_list = [ v1.x, v1.y, v1.z, t.x, v2.x, v2.y, v2.z, t.y, v3.x, v3.y, > v3.z, t.z, v4.x, v4.y, v4.z, t.w, ] > is this correct? > > I was expecting it to be: > b_list = [ v1.x, v1.y, v1.z, v1.w, v2.x, v2.y, v2.z, v2.w, v3.x, > v3.y, v3.z, v3.w, t.x, t.y, t.z, t.w, ] > as such, I wrote a transpose_translation() which as the name suggests > swaps out the last row and column so that a mat4 initialized with a b_list > results in the expected a_list form. Unfortunately with this method I'm > back to square one, where the decompose works, but any math operations > result in correct answers. It seems as if when the transform is in the last > row everything math wise works, but cgkit is expecting it in the last > column...where my math operations don't work. > > Does anyone have any tips on what I'm doing wrong or gotten things to work > between Maya and the cgkit? > > Thanks in advance, > Nathaniel > 
From: Matthias Baas <matthias.baas@gm...>  20110403 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 columnmajor or rowmajor 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 columnmajor order) in which case the transpose will be done implicitly by toList().  Matthias  
From: Nathaniel Albright <nathanieljla@gm...>  20110404 02:15:15
Attachments:
Message as HTML

Thanks for the reply Matthias, After sleeping on this debacle it had dawned on me that the transpose at the end (then asking for the rows) was pointless. At the same time I hadn't caught that I was copying the mat4, just to get another copy again with the transpose(). Good catch. Sadly, I had originally expected it would take a 10  20 minutes to set up a test scene and learn how to get the data in and out of Maya...instead it took the day. *sigh* How could something so simple become one of my more frustrating scripting experiences. I think this is right up there with my pain of doing a custom grid control in wxPython, but that's another story :) Nathaniel On Sun, Apr 3, 2011 at 12:59 PM, Matthias Baas <matthias.baas@...>wrote: > 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 columnmajor or > rowmajor 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 columnmajor order) in which > case the transpose will be done implicitly by toList(). > >  Matthias  > > >  > Create and publish websites with WebMatrix > Use the most popular FREE web apps or write code yourself; > WebMatrix provides all the features you need to develop and > publish your website. http://p.sf.net/sfu/mswebmatrixsf > _______________________________________________ > cgkituser mailing list > cgkituser@... > https://lists.sourceforge.net/lists/listinfo/cgkituser > 