|
|
|
package sig;
|
|
|
|
|
|
|
|
public class Matrix {
|
|
|
|
float[][] m = new float[4][4];
|
|
|
|
Matrix(){}
|
|
|
|
Matrix(float[][]m) {
|
|
|
|
this.m=m;
|
|
|
|
}
|
|
|
|
|
|
|
|
public final static Matrix IDENTITY = new Matrix(new float[][]{
|
|
|
|
{1,0,0,0},
|
|
|
|
{0,1,0,0},
|
|
|
|
{0,0,1,0},
|
|
|
|
{0,0,0,1},
|
|
|
|
});
|
|
|
|
|
|
|
|
public static Vector MultiplyVector(Matrix m, Vector i) {
|
|
|
|
return new Vector(
|
|
|
|
i.x*m.m[0][0]+i.y*m.m[1][0]+i.z*m.m[2][0]+i.w*m.m[3][0],
|
|
|
|
i.x*m.m[0][1]+i.y*m.m[1][1]+i.z*m.m[2][1]+i.w*m.m[3][1],
|
|
|
|
i.x*m.m[0][2]+i.y*m.m[1][2]+i.z*m.m[2][2]+i.w*m.m[3][2],
|
|
|
|
i.x*m.m[0][3]+i.y*m.m[1][3]+i.z*m.m[2][3]+i.w*m.m[3][3]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Matrix MakeRotationX(float angle) {
|
|
|
|
return new Matrix(new float[][]{
|
|
|
|
{1,0,0,0,},
|
|
|
|
{0,(float)Math.cos(angle),(float)Math.sin(angle),0,},
|
|
|
|
{0,(float)-Math.sin(angle),(float)Math.cos(angle),0,},
|
|
|
|
{0,0,0,1,},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
public static Matrix MakeRotationY(float angle) {
|
|
|
|
return new Matrix(new float[][]{
|
|
|
|
{(float)Math.cos(angle),0,(float)Math.sin(angle),0,},
|
|
|
|
{0,1,0,0,},
|
|
|
|
{(float)-Math.sin(angle),0,(float)Math.cos(angle),0,},
|
|
|
|
{0,0,0,1,},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
public static Matrix MakeRotationZ(float angle) {
|
|
|
|
return new Matrix(new float[][]{
|
|
|
|
{(float)Math.cos(angle),(float)Math.sin(angle),0,0,},
|
|
|
|
{(float)-Math.sin(angle),(float)Math.cos(angle),0,0,},
|
|
|
|
{0,0,1,0,},
|
|
|
|
{0,0,0,1,},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
public static Matrix MakeTranslation(float x,float y,float z) {
|
|
|
|
return new Matrix(new float[][]{
|
|
|
|
{1,0,0,0},
|
|
|
|
{0,1,0,0},
|
|
|
|
{0,0,1,0},
|
|
|
|
{x,y,z,1},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
public static Matrix MakeProjection(float fov,float aspectRatio,float near,float far) {
|
|
|
|
float fFovRad = 1f/(float)Math.tan(fov*0.5f/180f*Math.PI);
|
|
|
|
return new Matrix(
|
|
|
|
new float[][]{
|
|
|
|
{aspectRatio*fFovRad,0,0,0},
|
|
|
|
{0,fFovRad,0,0},
|
|
|
|
{0,0,far/(far-near),1f},
|
|
|
|
{0,0,(-far*near)/(far-near),0f},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
public static Matrix MultiplyMatrix(Matrix m1,Matrix m2) {
|
|
|
|
Matrix mm = new Matrix();
|
|
|
|
for (int c=0;c<4;c++) {
|
|
|
|
for (int r=0;r<4;r++) {
|
|
|
|
mm.m[r][c]=
|
|
|
|
m1.m[r][0]*m2.m[0][c]+
|
|
|
|
m1.m[r][1]*m2.m[1][c]+
|
|
|
|
m1.m[r][2]*m2.m[2][c]+
|
|
|
|
m1.m[r][3]*m2.m[3][c];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return mm;
|
|
|
|
}
|
|
|
|
public static Matrix PointAt(Vector pos,Vector target,Vector up) {
|
|
|
|
Vector newForward = Vector.subtract(target,pos);
|
|
|
|
newForward = Vector.normalize(newForward);
|
|
|
|
|
|
|
|
Vector a = Vector.multiply(newForward,Vector.dotProduct(up,newForward));
|
|
|
|
Vector newUp = Vector.subtract(up,a);
|
|
|
|
newUp = Vector.normalize(newUp);
|
|
|
|
|
|
|
|
Vector newRight = Vector.crossProduct(newUp,newForward);
|
|
|
|
|
|
|
|
return new Matrix(new float[][]{
|
|
|
|
{newRight.x,newRight.y,newRight.z,0},
|
|
|
|
{newUp.x,newUp.y,newUp.z,0},
|
|
|
|
{newForward.x,newForward.y,newForward.z,0},
|
|
|
|
{pos.x,pos.y,pos.z,1},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
public static Matrix QuickInverse(Matrix m) {
|
|
|
|
Matrix mm = new Matrix();
|
|
|
|
mm.m[0][0]=m.m[0][0];mm.m[0][1]=m.m[1][0];mm.m[0][2]=m.m[2][0];mm.m[0][3]=0;
|
|
|
|
mm.m[1][0]=m.m[0][1];mm.m[1][1]=m.m[1][1];mm.m[1][2]=m.m[2][1];mm.m[1][3]=0;
|
|
|
|
mm.m[2][0]=m.m[0][2];mm.m[2][1]=m.m[1][2];mm.m[2][2]=m.m[2][2];mm.m[2][3]=0;
|
|
|
|
mm.m[3][0]=-(m.m[3][0]*mm.m[0][0]+m.m[3][1]*mm.m[1][0]+m.m[3][2]*mm.m[2][0]);
|
|
|
|
mm.m[3][1]=-(m.m[3][0]*mm.m[0][1]+m.m[3][1]*mm.m[1][1]+m.m[3][2]*mm.m[2][1]);
|
|
|
|
mm.m[3][2]=-(m.m[3][0]*mm.m[0][2]+m.m[3][1]*mm.m[1][2]+m.m[3][2]*mm.m[2][2]);
|
|
|
|
mm.m[3][3]=1;
|
|
|
|
return mm;
|
|
|
|
}
|
|
|
|
}
|