Code archives/3D Graphics - Maths/Vector/Matrix Lib
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
V33 and a half. Added Gen_final_matrix..basically this totally simplifies the whole show, just use this to generate a transformation matrix, ePitch=20 eYaw=50 rRoll=0 X#=5 y#=5 z#=5 local tMatrix#[16] gen_final_matrix( ePitch,eYaw,eRoll,x,y,z,tMatrix) The result will be placed in tMatrix(Or whatever you call it, name is tied.) V1.1 Added functions to generate pitch/yaw/roll matrices and also a function to multiple two matrices by each other into a third output matrix(vital!) Basically to transform a point by a given pitch,yaw,roll as in blitz, do this, local pitchMatrix#[16],yawMatrix#[16],rollMatrix#[16] local tempMatrix#[16],finalMatrix#[16],positionMatrix#[16] gen_pitch_matrix( pitchMatrix,pitch) gen_yaw_matrix( yawMatrix,yaw) gen_roll_matrix( rollMatrix,roll) gen_position_matrix( positionMatrix,x,y,z) multi_mat( pitchMatrix,yawMatrix,tempMatrix) multi_mat( tempMatrix,rollMatrix,yawMatrix) multi_mat( rollMatrix,positionMatrix,finalMatrix) Now in final matrix you have a matrix that will transform any vector by the combined pitch/yaw/roll as expected. V1.0 - Perform matrice operations/transforms etc. There's also a tangent function in there to generate tangent space coords for normal/bump-mapping. Matrices are 16 element constant arrays. For example, local myMatrix[16] matrixIdentity( myMatrix) The reason being is there's no need to pass/collect the data, as the function works *directly* on the passed object. This is important for these type of mass use funcs... Also, vector(I.e 3 part variables) are 3 element constant arrays. i.e, local vectorA[3] myVectorFunc( vectorA) (btw I believe the triangle normal functions were culled from somewhere else..I know I didn't write them anyway, but definitely freeware..or I wouldn't have used them in the first place) | |||||
Function matrixIdentity(matrix#[16]) matrix[ 0] = 1.0; matrix[ 1] = 0.0; matrix[ 2] = 0.0; matrix[ 3] = 0.0; matrix[ 4] = 0.0; matrix[ 5] = 1.0; matrix[ 6] = 0.0; matrix[ 7] = 0.0; matrix[ 8] = 0.0; matrix[ 9] = 0.0; matrix[10] = 1.0; matrix[11] = 0.0; matrix[12] = 0.0; matrix[13] = 0.0; matrix[14] = 0.0; matrix[15] = 1.0; End Function Function gen_pitch_matrix(matrix#[16]) matrix[0]=1:matrix[1]=0:matrix[2]=0:matrix[3]=0 matrix[4]=0:matrix[5]=Cos(a):matrix[6]=Sin(a):matrix[7]=0 matrix[8]=0:matrix[9]=-Sin(a):matrix[10]=Cos(a):matrix[11]=0 matrix[12]=0:matrix[13]=0:matrix[14]=0:matrix[15]=1 End Function Function gen_yaw_mat(matrix#[16]) matrix[0]=Cos(a):matrix[1]=0:matrix[2]=-Sin(a):matrix[4]=0 matrix[4]=0:matrix[5]=1:matrix[6]=0:matrix[7]=0 matrix[8]=Sin(a):matrix[9]=0:matrix[10]=Cos(a):matrix[11]=0 matrix[12]=0:matrix[13]=0:matrix[14]=0:matrix[15]=0 End Function Function gen_roll_matrix(matrix#[16]) matrix[0]=Cos(a):matrix[1]=Sin(a):matrix[2]=0:matrix[3]=0 matrix[4]=-Sin(a):matrix[5]=Cos(a):matrix[6]=0:matrix[7]=0 matrix[8]=0:matrix[9]=0:matrix[10]=0:matrix[11]=0 matrix[12]=0:matrix[13]=0:matrix[14]=0:matrix[15]=0 End Function Function gen_position_matrix(matrix#[16],x#,y#,z#) matrix[0]=1:matrix[1]=0:matrix[2]=0:matrix[3]=x matrix[4]=0:matrix[5]=1:matrix[6]=0:matrix[7]=y matrix[8]=0:matrix[9]=0:matrix[10]=0:matrix[11]=z matrix[12]=0:matrix[13]=0:matrix[14]=0:matrix[15]=1 End Function Function multi_mat(matrix1#[16],matrix2#[16],matrix3#[16]) ;Takes matrices i1 and i2 and combines them, resulting in i3 For m=0 To 3 For m1=0 To 3 matrix3[ m1*4+m]=0 For m2=0 To 3 matrix3[ m1*4+m]=matrix3[ m1*4+m1]+matrix2[m2*4+m]*matrix1[m1*4+m2] Next Next Next End Function Function gen_final_matrix( pitch#,yaw#,roll#,x#,y#,z#,outMatrix#[16]) Local pitchMatrix#[16],yawMatrix#[16],rollMatrix#[16] Local positionMatrix#[16],tempMatrix#[16] gen_pitch_matrix( pitchMatrix,pitch) gen_yaw_matrix( yawMatrix,yaw) gen_roll_matrix( rollMatrix,roll) gen_position_matrix( positionMatrix,x,y,z) multi_mat(pitchMatrix,yawMatrix,tempMatrix) multi_mat(tempMatrix,rollMatrix,pitchMatrix) multi_mat(pitchMatrix,positionMatrix,outMatrix) End Function ;////////////////////////// ;// Invert a matrix. (Matrix MUST be orhtonormal!) ;// in - Input matrix ;// out - Output matrix ;////////////////////////// Function matrixInvert(in#[16], out#[16]) ; // Transpose rotation out[ 0] = in[ 0]; out[ 1] = in[ 4]; out[ 2] = in[ 8]; out[ 4] = in[ 1]; out[ 5] = in[ 5]; out[ 6] = in[ 9]; out[ 8] = in[ 2]; out[ 9] = in[ 6]; out[10] = in[10]; ; // Clear shearing terms out[3] = 0.0;f; out[7] = 0.0f; out[11] = 0.0f; out[15] = 1.0f; ; // Translation is minus the dot of tranlation And rotations out[12] = -(in[12]*in[ 0]) - (in[13]*in[ 1]) - (in[14]*in[ 2]); out[13] = -(in[12]*in[ 4]) - (in[13]*in[ 5]) - (in[14]*in[ 6]); out[14] = -(in[12]*in[ 8]) - (in[13]*in[ 9]) - (in[14]*in[10]); End Function ;////////////////////////// ;// Multiply a vector by a matrix. ;// vecIn - Input vector ;// m - Input matrix ;/////////////////////////// Function vecMatMult(vecIn#[3],m#[16], vecOut#[3]) vecOut[0] = (vecIn[0]*m[ 0]) + (vecIn[1]*m[ 4]) + (vecIn[2]*m[ 8]) + m[12]; vecOut[1] = (vecIn[0]*m[ 1]) + (vecIn[1]*m[ 5]) + (vecIn[2]*m[ 9]) + m[13]; vecOut[2] = (vecIn[0]*m[ 2]) + (vecIn[1]*m[ 6]) + (vecIn[2]*m[10]) + m[14]; End Function ;////////////////////////// ;// Multiply a vector by just the 3x3 portion of a matrix. ;// vecIn - Input vector ;// m - Input matrix ;// vecOut - Output vector ;////////////////////////// ;void Function vecMat3x3Mult(vecIn#[3], m#[16], vecOut#[3]) vecOut[0] = (vecIn[0]*m[ 0]) + (vecIn[1]*m[ 4]) + (vecIn[2]*m[ 8]); vecOut[1] = (vecIn[0]*m[ 1]) + (vecIn[1]*m[ 5]) + (vecIn[2]*m[ 9]); vecOut[2] = (vecIn[0]*m[ 2]) + (vecIn[1]*m[ 6]) + (vecIn[2]*m[10]); End Function Function vecCrossProd (vecA#[3], vecB#[3], vecOut#[3]) vecOut[0] = vecA[1]*vecB[2] - vecA[2]*vecB[1]; vecOut[1] = vecA[2]*vecB[0] - vecA[0]*vecB[2]; vecOut[2] = vecA[0]*vecB[1] - vecA[1]*vecB[0]; End Function Function vecNormalize#(vec#[3]) mag# = Sqr(vec[0]*vec[0] +vec[1]*vec[1] +vec[2]*vec[2]); ;// don't divide by zero If (mag=0) vec[0] = 0.0;f; vec[1] = 0.0;f; vec[2] = 0.0;f; Return(0.0); EndIf vec[0] =vec[0]/mag; vec[1] =vec[1]/mag; vec[2] =vec[2]/mag; Return(mag); End Function Function vecDotProd#(vecA#[3], vecB#[3]) Return(vecA[0]*vecB[0] +vecA[1]*vecB[1] +vecA[2]*vecB[2]); End Function Function vecCopy (vecIn#[3], vecOut#[3]) vecOut[0] = vecIn[0]; vecOut[1] = vecIn[1]; vecOut[2] = vecIn[2]; End Function Function vector( v1#,v2#,v3#,vect#[3]) vect[0]=v1 vect[1]=v2 vect[2]=v3 End Function Function tang( vertex#[3], vertex2#[3], vertex3#[3],texcoords#[2], texcoords2#[2], texcoords3#[2],polynormal#[3], tangent#[3], binormal#[3], normal#[3] ) Local txb#[3]; Local v1#[3],v2#[3] VECTOR( vertex2[0] - vertex[0], texcoords2[0] - texcoords[0], texcoords2[1] - texcoords[1],v1 ); VECTOR( vertex3[0] - vertex[0], texcoords3[0] - texcoords[0], texcoords3[1] - texcoords[1],v2 ); crossProduct( v1, v2,txb ); If( Abs( txb[0] ) > EPSILON ) tangent[0] = -txb[1] / txb[0]; binormal[0] = -txb[2] / txb[0]; EndIf v1[0] = vertex2[1] - vertex[1]; v2[0] = vertex3[1] - vertex[1]; CrossProduct( v1, v2,txb ); If( Abs( txb[0] ) > EPSILON ) tangent[1] = -txb[1] / txb[0]; binormal[1] = -txb[2] / txb[0]; EndIf v1[0] = vertex2[2] - vertex[2]; v2[0] = vertex3[2] - vertex[2]; CrossProduct( v1, v2,txb); If( Abs( txb[0] ) > EPSILON ) tangent[2] = -txb[1] / txb[0]; binormal[2] = -txb[2] / txb[0]; EndIf Normalize( tangent ); Normalize( binormal ); ;// Make a normal based on the tangent And binormal b/c it may be different than the poly's ;// normal, this normal being computed here is better CrossProduct( tangent, binormal,normal); Normalize( normal ); ;// Make tangent space vectors orthogonal by recomputing the binormal with the corrected ;// tangent space normal. CrossProduct( tangent, normal,biNormal); Normalize( binormal ); If( vecDotProd( normal, polynormal ) < 0.0 ) normal[0] = -normal[0]; normal[1] = -normal[1]; normal[2] = -normal[2]; EndIf End Function Function TriangleNormal#(v1#[3],v2#[3],v3#[3],o#[3]) ;SubVector v1,v2, ux#=VectorX() uy#=VectorY() uz#=VectorZ() ;SubVector Cx#,Cy#,Cz#,Bx#,By#,Bz# vx#=VectorX() vy#=VectorY() vz#=VectorZ() ;CrossProduct vx#,vy#,vz#,ux#,uy#,uz# ;Normalize vectorx,vectory,vectorz ;Return Ax#*vectorx+Ay#*vectory+Az#*vectorz End Function Function VectorX#() Return vectorx End Function Function VectorY#() Return vectory End Function Function VectorZ#() Return vectorz End Function Function VectorW#() Return vectorw End Function Function SubVector(v1#[3],v2#[3],o#[3]) o[0]=v1[0]-v2[0] o[1]=v1[1]-v2[1] o[2]=v1[2]=v2[2] End Function Function Normalize(v#[3]) If v[0]=0 And v[1]=0 And v[2]=0 Return m#=Magnitude(v) v[0]=v[0]/m# v[1]=v[1]/m# v[2]=v[2]/m# End Function Function CrossProduct(v1#[3],v2#[3],o#[3]) o[0]=v1[1]*v2[2]-v2[2]*v2[1] o[1]=v1[2]*v2[0]-v1[0]*v2[2] o[2]=v1[0]*v2[1]-v1[1]*v2[0] End Function Function Magnitude(v#[3]) Return Sqr( (v[0]*v[0]) + (v[1]*v[1]) + (v[2]*v[2]) ) End Function Function TriangleNX#(surf,tri_no) v0=TriangleVertex(surf,tri_no,0) v1=TriangleVertex(surf,tri_no,1) v2=TriangleVertex(surf,tri_no,2) ax#=VertexX#(surf,v1)-VertexX#(surf,v0) ay#=VertexY#(surf,v1)-VertexY#(surf,v0) az#=VertexZ#(surf,v1)-VertexZ#(surf,v0) bx#=VertexX#(surf,v2)-VertexX#(surf,v1) by#=VertexY#(surf,v2)-VertexY#(surf,v1) bz#=VertexZ#(surf,v2)-VertexZ#(surf,v1) nx#=(ay#*bz#)-(az#*by#) Return nx# End Function Function TriangleNY#(surf,tri_no) v0=TriangleVertex(surf,tri_no,0) v1=TriangleVertex(surf,tri_no,1) v2=TriangleVertex(surf,tri_no,2) ax#=VertexX#(surf,v1)-VertexX#(surf,v0) ay#=VertexY#(surf,v1)-VertexY#(surf,v0) az#=VertexZ#(surf,v1)-VertexZ#(surf,v0) bx#=VertexX#(surf,v2)-VertexX#(surf,v1) by#=VertexY#(surf,v2)-VertexY#(surf,v1) bz#=VertexZ#(surf,v2)-VertexZ#(surf,v1) ny#=(az#*bx#)-(ax#*bz#) Return ny# End Function Function TriangleNZ#(surf,tri_no) v0=TriangleVertex(surf,tri_no,0) v1=TriangleVertex(surf,tri_no,1) v2=TriangleVertex(surf,tri_no,2) ax#=VertexX#(surf,v1)-VertexX#(surf,v0) ay#=VertexY#(surf,v1)-VertexY#(surf,v0) az#=VertexZ#(surf,v1)-VertexZ#(surf,v0) bx#=VertexX#(surf,v2)-VertexX#(surf,v1) by#=VertexY#(surf,v2)-VertexY#(surf,v1) bz#=VertexZ#(surf,v2)-VertexZ#(surf,v1) nz#=(ax#*by#)-(ay#*bx#) Return nz# End Function |
Comments
| ||
Well does gen_pitch_matrix() have one or two parameters? And where is gen_yaw_matrix? |
| ||
did you even test/use this matrix lib before you posted it here, or did you just write it down and put it here? the matrixIdentity function is crap as well. |
| ||
Riiiiight. Three year old math library and you're complaining to a banned user? |
| ||
HAHAHAHAHHHAH |
| ||
gen_yaw_matrix() is gen_yaw_mat(). Agreed, it's not very tidy code but what do you expect, it's free. I think it's pretty good code overall. |
Code Archives Forum