Hi Adam, This short video basically visualizes Chad's explanation, if it is helpful
http://adammechtley.com/tutorials/rigging/aim-constraints/ On Wednesday, August 25, 2010, Chad Vernon <[email protected]> wrote: > The ^ is a cross product. n, t, and x are MVectors which are part of the > Maya API. So, n.x, n.y, n.z are just the 3 components of the vector n. You > should be able to use either the binormal or the tangent. You could also > even use an adjacent vertex. > > On Wed, Aug 25, 2010 at 12:23 AM, Adam Miels <[email protected]> wrote: > > Hi Chad, > > Thanks for your reply. > > Is the ^ representing to the power of? > > I am not really worried about the rotation around the normal at this > stage, so can I use the getFaceVertexBinormal to get the tangent? > > I am not sure what the . in the matrix you drew represents, is this a > dot product? > > Regards, > > Adam. > > On Wed, Aug 25, 2010 at 4:54 PM, Chad Vernon <[email protected]> wrote: >> You need more than one vector to set an orientation since there are infinite >> orientations that can spin around the normal. You need at least 2 >> non-parallel vectors to create an orientation. >> >> If you have a normal vector n and a tangent vector t, you can create an >> orthonormal basis by: >> >> x = n ^ t >> t = x ^ n >> >> Then you can pick which axis is which for your matrix: >> x.x x.y x.z 0 >> n.x n.y n.z 0 >> t.x t.y t.z 0 >> 0 0 0 1 >> >> Chad >> >> On Tue, Aug 24, 2010 at 11:44 PM, Adam Miels <[email protected]> wrote: >>> >>> Hi All. >>> >>> Not really a question specific to Python in Maya, but I am trying to >>> write this in python, and know that there are quite a few experienced >>> maya people on the list. >>> >>> I was wondering if there was possibly a better way to do this. >>> >>> I am querying a point on a surface, to get a normal vector, then >>> trying to use this vector to orient an objects rotation matrix so that >>> it points in the direction of surface. >>> I have written my own method to apply the transform as .setTransform >>> in pymel doesn't seem to work: >>> >>> def mySetMatrix(anObject, aMatrix): >>> >>> select(anObject) >>> >>> xform(m=(aMatrix.a00,aMatrix.a01,aMatrix.a02,aMatrix.a03, \ >>> >>> aMatrix.a10,aMatrix.a11,aMatrix.a12,aMatrix.a13, \ >>> >>> aMatrix.a20,aMatrix.a21,aMatrix.a22,aMatrix.a23, \ >>> >>> aMatrix.a30,aMatrix.a31,aMatrix.a32,aMatrix.a33)) >>> >>> I query the point on the surface with: >>> >>> normalVector = aMesh.getClosestNormal(aPoint, 'world')[0] >>> >>> and then use the X,Y,Z values of this vector to calculate the >>> following matrices: >>> >>> rotate on x axis: >>> where X = atan2(Y,Z) >>> >>> 1 0 0 0 >>> >>> 0 cosX -sinX 0 >>> >>> 0 sinX cosX 0 >>> >>> 0 0 0 1 >>> >>> >>> rotate on y axis: >>> where Y = atan2(X,Z) >>> >>> cosY 0 sinY 0 >>> >>> 0 1 0 0 >>> >>> -sinY 0 cosX 0 >>> >>> 0 0 0 1 >>> >>> >>> rotate on z axis: >>> where Z = atan2(Y,X) >>> >>> cosZ -sinZ 0 0 >>> >>> sinZ cosZ 0 0 >>> >>> 0 0 1 0 >>> >>> 0 0 0 1 >>> >>> and then assigning the resulting matrix (original Matrx) X (X Matrix) >>> X (Y Matrix) X (Z Matrix) to the original object. >>> >>> Although this approach seems to make sense to me on paper, when I >>> implement it, I get matrices that end up scaling the object instead of >>> only affecting its rotations, and they point in the wrong directions. >>> >>> I was wondering if anyone could point me in the right direction with >>> this one (literally :P ) ? >>> >>> Regards, >>> >>> Adam Miels. >>> >>> -- >>> http://groups.google.com/group/python_inside_maya >> >> -- >> <http://groups.google.com/group/python_inside_maya> > > -- > http://groups.google.com/group/python_inside_maya -- http://groups.google.com/group/python_inside_maya
