I think he's looking for the raw math sans Softimage API.

As for working with texts and papers from online, you'll need to pay attention 
to what kind of vectors are used.  Many use column vectors in their matrices.  
Softimage uses row vectors.  You cannot mix n' match, you must align all data 
to be consistently row vectors or consistently column vectors.  You can convert 
a matrix to/from row aligned via a transpose (flip entries across main 
diagonal).

I would also advise using more parenthesis to ensure order of operations are 
enforced in your computations.  You'd be surprised how often silly mistakes 
result from this.

As a learning exercise I would advise doing it all long hand by building a 
matrix for the initial transformation of the null then multiply it in turn by 
each rotation vector (euler angle) because a transformation is essentially a 
series of matrix and vector multiplications performed in a specific order (XYZ 
in this case).  The algorithm you are using is an abbreviated version because 
many terms simplify during the computations.  If you do it long hand you should 
get the correct result.  From that you can trace your steps backwards to find 
your error in your initial attempts.

Matt




From: [email protected] 
[mailto:[email protected]] On Behalf Of Vladimir 
Jankijevic
Sent: Monday, August 26, 2013 3:46 PM
To: [email protected]
Subject: Re: SI Matrix3 and Maths

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]<mailto:[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]>
 
[mailto:[email protected]<mailto:[email protected]>]
 On Behalf Of Eric Thivierge
Sent: Monday, August 26, 2013 2:46 PM
To: [email protected]<mailto:[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




Reply via email to