MiniB3D Thread 3

BlitzMax Modules Forums/MiniB3D/MiniB3D Thread 3

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

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:

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.