|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|