Alrighty then...
After banging my head against Left Handed/Right Handed Matrices for a Looong time. I've made some working additions to the TMatrix Class. Just add in these methods:
This will allow you to convert normals and vectors by an arbitrary matrix and to invert the matrix to do the opposite.
After banging my head against Left Handed/Right Handed Matrices for a Looong time. I've made some working additions to the TMatrix Class. Just add in these methods:
Method MultiplyVector(I:TVector var, O:TVector Var) Local Mt:TMatrix = New TMatrix Local tmp:Float[3] Local tmp2:Float[3] Local itmp3:Float mt.LoadIdentity mt.Scale(1,1,-1) mt.Multiply(Self) itmp3 = 1.0 /(I.x*mt.grid[0,3]+I.y*mt.grid[1,3]+I.z*mt.grid[2,3]+mt.grid[3,3]) tmp[0] = itmp3*I.x tmp[1] = itmp3*I.y tmp[2] = itmp3*(I.z*-1) O.x=tmp[0]*(mt.grid[0,0])+(tmp[1])*(mt.grid[1,0])+tmp[2]*(mt.grid[2,0])+itmp3*(mt.grid[3,0]) O.y=tmp[0]*(mt.grid[0,1])+(tmp[1])*(mt.grid[1,1])+tmp[2]*(mt.grid[2,1])+itmp3*(mt.grid[3,1]) O.z=tmp[0]*(mt.grid[0,2])+(tmp[1])*(mt.grid[1,2])+tmp[2]*(mt.grid[2,2])+itmp3*(mt.grid[3,2]) End Method Method MultiplyNormal(I:TVector var, O:TVector Var) Local Mt:TMatrix = New TMatrix mt.LoadIdentity mt.Scale(1,1,-1) mt.Multiply(Self) Local tmp:Float[3] Local itmp:Float tmp[0]=I.x*mt.grid[0,0]+I.y*mt.grid[1,0]+(I.z*-1)*mt.grid[2,0] tmp[1]=I.x*mt.grid[0,1]+I.y*mt.grid[1,1]+(I.z*-1)*mt.grid[2,1] tmp[2]=I.x*mt.grid[0,2]+I.y*mt.grid[1,2]+(I.z*-1)*mt.grid[2,2] itmp=1.0/sqr(tmp[0]*tmp[0]+tmp[1]*tmp[1]+tmp[2]*tmp[2]) O.x=tmp[0]*itmp O.y=tmp[1]*itmp O.z=tmp[2]*itmp End Method Method Invert:TMatrix() ' Returns an Inverted Matrix Local out:TMatrix = New TMatrix Adjoint(out) Return out End Method Method Adjoint( out:TMatrix Var ) out.grid[0,0] = det3x3(grid[1,1], grid[2,1], grid[3,1], grid[1,2], grid[2,2], grid[3,2], grid[1,3], grid[2,3], grid[3,3]) out.grid[1,0] = - det3x3(grid[1,0], grid[2,0], grid[3,0], grid[1,2], grid[2,2], grid[3,2], grid[1,3], grid[2,3], grid[3,3]) out.grid[2,0] = det3x3(grid[1,0], grid[2,0], grid[3,0], grid[1,1], grid[2,1], grid[3,1], grid[1,3], grid[2,3], grid[3,3]) out.grid[3,0] = - det3x3(grid[1,0], grid[2,0], grid[3,0], grid[1,1], grid[2,1], grid[3,1], grid[1,2], grid[2,2], grid[3,2]) out.grid[0,1] = - det3x3( grid[0,1], grid[2,1], grid[3,1], grid[0,2], grid[2,2], grid[3,2], grid[0,3], grid[2,3], grid[3,3]) out.grid[1,1] = det3x3( grid[0,0], grid[2,0], grid[3,0], grid[0,2], grid[2,2], grid[3,2], grid[0,3], grid[2,3], grid[3,3]) out.grid[2,1] = - det3x3( grid[0,0], grid[2,0], grid[3,0], grid[0,1], grid[2,1], grid[3,1], grid[0,3], grid[2,3], grid[3,3]) out.grid[3,1] = det3x3( grid[0,0], grid[2,0], grid[3,0], grid[0,1], grid[2,1], grid[3,1], grid[0,2], grid[2,2], grid[3,2]) out.grid[0,2] = det3x3( grid[0,1], grid[1,1], grid[3,1], grid[0,2], grid[1,2], grid[3,2], grid[0,3], grid[1,3], grid[3,3]) out.grid[1,2] = - det3x3( grid[0,0], grid[1,0], grid[3,0], grid[0,2], grid[1,2], grid[3,2], grid[0,3], grid[1,3], grid[3,3]) out.grid[2,2] = det3x3( grid[0,0], grid[1,0], grid[3,0], grid[0,1], grid[1,1], grid[3,1], grid[0,3], grid[1,3], grid[3,3]) out.grid[3,2] = - det3x3( grid[0,0], grid[1,0], grid[3,0], grid[0,1], grid[1,1], grid[3,1], grid[0,2], grid[1,2], grid[3,2]) out.grid[0,3] = - det3x3( grid[0,1], grid[1,1], grid[2,1], grid[0,2], grid[1,2], grid[2,2], grid[0,3], grid[1,3], grid[2,3]) out.grid[1,3] = det3x3( grid[0,0], grid[1,0], grid[2,0], grid[0,2], grid[1,2], grid[2,2], grid[0,3], grid[1,3], grid[2,3]) out.grid[2,3] = - det3x3( grid[0,0], grid[1,0], grid[2,0], grid[0,1], grid[1,1], grid[2,1], grid[0,3], grid[1,3], grid[2,3]) out.grid[3,3] = det3x3( grid[0,0], grid[1,0], grid[2,0], grid[0,1], grid[1,1], grid[2,1], grid[0,2], grid[1,2], grid[2,2]) EndMethod Function det3x3!( a1!, a2!, a3!, b1!, b2!, b3!, c1!, c2!, c3! ) Local ans! ans = a1 * det2x2( b2, b3, c2, c3 ) ans = ans - b1 * det2x2( a2, a3, c2, c3 ) ans = ans + c1 * det2x2( a2, a3, b2, b3 ) Return ans End Function Function det2x2!( a!, b!, c!, d!) Return a*d-b*c End Function
This will allow you to convert normals and vectors by an arbitrary matrix and to invert the matrix to do the opposite.