oh and by the way. I have expanded the matrix multiplication for you to better understand how it works but as we are dealing with known matrix values it can be shortened to the line you have from the book. So no need to multiply all that stuff with all the zeros and ones :)
Cheers On Mon, Aug 26, 2013 at 6:57 PM, Vladimir Jankijevic < [email protected]> wrote: > oh, and you have a typo in 'matX.Set(0,1,0,0,cx,sx,0,-sx,**cx)' > it should be 'matX.Set(1,0,0,0,cx,sx,0,-sx,**cx)' > > > On Mon, Aug 26, 2013 at 6:45 PM, Vladimir Jankijevic < > [email protected]> wrote: > >> if you want to do it the hard way you can do it like this: >> >> # Python >> import math >> x = -45.0 >> y = 45.0 >> z = 0.0 >> >> def degToRad(value): >> return value * (math.pi / 180) >> >> cx = math.cos(degToRad(x)) >> sx = math.sin(degToRad(x)) >> cy = math.cos(degToRad(y)) >> sy = math.sin(degToRad(y)) >> cz = math.cos(degToRad(z)) >> sz = math.sin(degToRad(z)) >> >> >> rotationX = XSIMath.CreateMatrix3( 1,0,0, >> 0,cx,sx, >> 0,-sx,cx) >> rotationY = XSIMath.CreateMatrix3( cy,0,-sy, >> 0,1,0, >> sy,0,cy) >> rotationZ = XSIMath.CreateMatrix3( cz,sz,0, >> -sz,cz,0, >> 0,0,1) >> rotationXY = XSIMath.CreateMatrix3( rotationX.Value(0,0) * >> rotationY.Value(0,0) + rotationX.Value(0,1) * rotationY.Value(1,0) + >> rotationX.Value(0,2) * rotationY.Value(2,0), >> rotationX.Value(0,0) * rotationY.Value(0,1) + rotationX.Value(0,1) * >> rotationY.Value(1,1) + rotationX.Value(0,2) * rotationY.Value(2,1), >> rotationX.Value(0,0) * rotationY.Value(0,2) + rotationX.Value(0,1) * >> rotationY.Value(1,2) + rotationX.Value(0,2) * rotationY.Value(2,2), >> rotationX.Value(1,0) * rotationY.Value(0,0) + rotationX.Value(1,1) * >> rotationY.Value(1,0) + rotationX.Value(1,2) * rotationY.Value(2,0), >> rotationX.Value(1,0) * rotationY.Value(0,1) + rotationX.Value(1,1) * >> rotationY.Value(1,1) + rotationX.Value(1,2) * rotationY.Value(2,1), >> rotationX.Value(1,0) * rotationY.Value(0,2) + rotationX.Value(1,1) * >> rotationY.Value(1,2) + rotationX.Value(1,2) * rotationY.Value(2,2), >> rotationX.Value(2,0) * rotationY.Value(0,0) + rotationX.Value(2,1) * >> rotationY.Value(1,0) + rotationX.Value(2,2) * rotationY.Value(2,0), >> rotationX.Value(2,0) * rotationY.Value(0,1) + rotationX.Value(2,1) * >> rotationY.Value(1,1) + rotationX.Value(2,2) * rotationY.Value(2,1), >> rotationX.Value(2,0) * rotationY.Value(0,2) + rotationX.Value(2,1) * >> rotationY.Value(1,2) + rotationX.Value(2,2) * rotationY.Value(2,2)) >> rotationXYZ = XSIMath.CreateMatrix3(rotationXY.Value(0,0) * >> rotationZ.Value(0,0) + rotationXY.Value(0,1) * rotationZ.Value(1,0) + >> rotationXY.Value(0,2) * rotationZ.Value(2,0), >> rotationXY.Value(0,0) * rotationZ.Value(0,1) + rotationXY.Value(0,1) * >> rotationZ.Value(1,1) + rotationXY.Value(0,2) * rotationZ.Value(2,1), >> rotationXY.Value(0,0) * rotationZ.Value(0,2) + rotationXY.Value(0,1) * >> rotationZ.Value(1,2) + rotationXY.Value(0,2) * rotationZ.Value(2,2), >> rotationXY.Value(1,0) * rotationZ.Value(0,0) + rotationXY.Value(1,1) * >> rotationZ.Value(1,0) + rotationXY.Value(1,2) * rotationZ.Value(2,0), >> rotationXY.Value(1,0) * rotationZ.Value(0,1) + rotationXY.Value(1,1) * >> rotationZ.Value(1,1) + rotationXY.Value(1,2) * rotationZ.Value(2,1), >> rotationXY.Value(1,0) * rotationZ.Value(0,2) + rotationXY.Value(1,1) * >> rotationZ.Value(1,2) + rotationXY.Value(1,2) * rotationZ.Value(2,2), >> rotationXY.Value(2,0) * rotationZ.Value(0,0) + rotationXY.Value(2,1) * >> rotationZ.Value(1,0) + rotationXY.Value(2,2) * rotationZ.Value(2,0), >> rotationXY.Value(2,0) * rotationZ.Value(0,1) + rotationXY.Value(2,1) * >> rotationZ.Value(1,1) + rotationXY.Value(2,2) * rotationZ.Value(2,1), >> rotationXY.Value(2,0) * rotationZ.Value(0,2) + rotationXY.Value(2,1) * >> rotationZ.Value(1,2) + rotationXY.Value(2,2) * rotationZ.Value(2,2)) >> xfo = XSIMath.CreateTransform() >> xfo.SetRotationFromMatrix3(rotationXYZ) >> >> Application.Selection(0).Kinematics.Global.PutTransform2(None, xfo) >> >> >> >> On Mon, Aug 26, 2013 at 6:05 PM, Matt Lind <[email protected]>wrote: >> >>> Don't you have Mr LaForge and Mr. LeClaire at your disposal? I would >>> think they could answer in a heartbeat. >>> >>> >>> Anyway, an alternate way of dealing with this problem is to export the >>> axis vectors instead of computing the rotations. This ensures you get a >>> match and you don't have to deal with math. >>> >>> >>> Matt >>> >>> >>> >>> >>> -----Original Message----- >>> From: [email protected] [mailto: >>> [email protected]] On Behalf Of Eric Thivierge >>> Sent: Monday, August 26, 2013 2:46 PM >>> To: [email protected] >>> Subject: SI Matrix3 and Maths >>> >>> Hey all, >>> >>> Plunging ever further into the depths of matrices and the fun math >>> issues one may need to solve while building some tools for the studio. >>> >>> I'm trying to figure out how the SI Matrix3's are derived / set and am >>> hitting some walls. I have some Euler angles that I need to convert to >>> Matrix3's then set a Transform from the result. >>> >>> Basically a Euler angle to Matrix3 operation. I need to solve this >>> without the built in methods as I need to convert data from external >>> sources to align with Softimage without the SDK available. >>> >>> I've referenced many of web sites (wikipedia, educational institutions, >>> etc.) and all of the equations for multiplying the 3 matrices (x,y,z) >>> end up with results that are not consistent with Softimage's methods. >>> The only source that has proven to give me valid results is the 3D Math >>> Primer for Graphics and Game Dev book (Chapter 8.7). However it only shows >>> the solution for XYZ rotation order and even that I'm unsure how they got >>> the order in which they multiply the rows / columns. >>> >>> If any of you smart people out there (Raf, Matt?) have a few free >>> minutes to review my below code and show me the error of my ways I'd >>> appreciate it. Maybe others could benefit too. >>> >>> Create 2 nulls. Set one rotation to x = -45, y=45 Select 2nd null and >>> run script. >>> Swap the commented "result" line and run again. >>> >>> # Python >>> import math >>> >>> si = Application >>> log = si.LogMessage >>> sel = si.Selection >>> >>> def degToRad(value): >>> return value * (math.pi / 180) >>> >>> x = -45 >>> y = 45 >>> z = 0 >>> >>> >>> cx = math.cos(degToRad(x)) >>> sx = math.sin(degToRad(x)) >>> cy = math.cos(degToRad(y)) >>> sy = math.sin(degToRad(y)) >>> cz = math.cos(degToRad(z)) >>> sz = math.sin(degToRad(z)) >>> >>> >>> matX = XSIMath.CreateMatrix3() >>> matX.Set(0,1,0,0,cx,sx,0,-sx,cx) >>> >>> matY = XSIMath.CreateMatrix3() >>> matY.Set(cy,0,-sy,0,1,0,sy,0,cy) >>> >>> matZ = XSIMath.CreateMatrix3() >>> matZ.Set(cz,sz,0,-sz,cz,0,0,0,1) >>> >>> result = XSIMath.CreateMatrix3() >>> # From most sites I referenced-ish >>> #result.Set(cz*cy, sz*cx + cz*sy*sx, sz*sx - cz*sy*cx, -sz*cy, cz*cx - >>> sz*sy*sx, cz*sx + sz*sy*cx, sy, -cy*sx, cy*cx) >>> >>> result.Set(cy*cz + sy*sx*sz, sz*cx, -sy*cz + cy*sx*sz, -cy*sz + >>> sy*sx*cz, cz*cx, sz*sy + cy*sx*cz, sy*cx, -sx, cy*cx) # From Book >>> >>> log(result.Get2()) >>> >>> xfo = XSIMath.CreateTransform() >>> xfo.SetRotationFromMatrix3(result) >>> >>> sel(0).Kinematics.Global.PutTransform2(None, xfo) >>> >>> # End Python >>> >>> -- >>> >>> Eric Thivierge >>> =============== >>> Character TD / RnD >>> Hybride Technologies >>> >>> >>> >>> >>> >> >

