Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Matrix4 {
- private double[][] internalMatrix = new double[4][4];
- boolean lefthanded = false;
- Matrix4() {
- identity();
- }
- Matrix4(double a00, double a01, double a02, double a03, double a10, double a11, double a12, double a13, double a20, double a21, double a22, double a23, double a30, double a31, double a32, double a33) {
- this.internalMatrix[0][0] = a00;
- this.internalMatrix[0][1] = a01;
- this.internalMatrix[0][2] = a02;
- this.internalMatrix[0][3] = a03;
- this.internalMatrix[1][0] = a10;
- this.internalMatrix[1][1] = a11;
- this.internalMatrix[1][2] = a12;
- this.internalMatrix[1][3] = a13;
- this.internalMatrix[2][0] = a20;
- this.internalMatrix[2][1] = a21;
- this.internalMatrix[2][2] = a22;
- this.internalMatrix[2][3] = a23;
- this.internalMatrix[3][0] = a30;
- this.internalMatrix[3][1] = a31;
- this.internalMatrix[3][2] = a32;
- this.internalMatrix[3][3] = a33;
- }
- Matrix4(double[][] input) {
- this.internalMatrix = input;
- }
- public Matrix4 identity() {
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- this.internalMatrix[i][j] = _identitydiagonal(i, j);
- }
- }
- return this;
- }
- private static double _identitydiagonal(int row, int column) {
- return row == column ? 1.0 : 0.0;
- }
- /*
- * General form of the Projection Matrix
- *
- * uh = Cot( fov/2 ) == 1/Tan(fov/2) uw / uh = 1/aspect
- *
- * uw 0 0 0 0 uh 0 0 0 0 f/(f-n) 1 0 0 -fn/(f-n) 0
- *
- * Make result to be identity first
- *
- * check for bad parameters to avoid divide by zero: if found, assert and
- * return an identity matrix.
- *
- * @Source:
- * https://stackoverflow.com/questions/18404890/how-to-build-perspective-
- * projection-matrix-no-api
- */
- public Matrix4 perspective(float fov, float aspectRatio, float zNear, float zFar) {
- if (fov <= 0 || aspectRatio == 0) {
- return identity();
- }
- float frustumDepth = zFar - zNear;
- float oneOverDepth = 1 / frustumDepth;
- this.internalMatrix[1][1] = 1 / Math.tan(0.5D * fov);
- this.internalMatrix[0][0] = (this.lefthanded ? 1 : -1) * this.internalMatrix[1][1] / aspectRatio;
- this.internalMatrix[2][2] = zFar * oneOverDepth;
- this.internalMatrix[3][2] = (-zFar * zNear) * oneOverDepth;
- this.internalMatrix[2][3] = 1;
- this.internalMatrix[3][3] = 0;
- return this;
- }
- public Matrix4 rotate(float radians, Vertex vertex) {
- float temp1 = (float) vertex.getX();
- float temp2 = (float) vertex.getY();
- float temp3 = (float) vertex.getZ();
- if (temp1 != 0 && temp2 == 0 && temp3 == 0) {
- rotateX(radians);
- }
- if (temp1 == 0 && temp2 != 0 && temp3 == 0) {
- rotateY(radians);
- }
- if (temp1 == 0 && temp2 == 0 && temp3 != 0) {
- rotateZ(radians);
- }
- return rotation(radians, temp1, temp2, temp3);
- }
- /*
- * @Source:
- * http://www.codinglabs.net/article_world_view_projection_matrix.aspx
- */
- public Matrix4 rotateX(float theta) {
- this.internalMatrix[0][0] = 1.0;
- this.internalMatrix[0][1] = 0.0;
- this.internalMatrix[0][2] = 0.0;
- this.internalMatrix[0][3] = 0.0;
- this.internalMatrix[1][0] = 0.0;
- this.internalMatrix[1][1] = Math.cos(theta);
- this.internalMatrix[1][2] = Math.sin(theta);
- this.internalMatrix[1][3] = 0.0;
- this.internalMatrix[2][0] = 0.0;
- this.internalMatrix[2][1] = -Math.sin(theta);
- this.internalMatrix[2][2] = Math.cos(theta);
- this.internalMatrix[2][3] = 0.0;
- this.internalMatrix[3][0] = 0.0;
- this.internalMatrix[3][1] = 0.0;
- this.internalMatrix[3][2] = 0.0;
- this.internalMatrix[3][3] = 1.0;
- return this;
- }
- /*
- * @Source:
- * http://www.codinglabs.net/article_world_view_projection_matrix.aspx
- */
- public Matrix4 rotateY(float theta) {
- this.internalMatrix[0][0] = Math.cos(theta);
- this.internalMatrix[0][1] = 0.0;
- this.internalMatrix[0][2] = Math.sin(theta);
- this.internalMatrix[0][3] = 0.0;
- this.internalMatrix[1][0] = 0.0;
- this.internalMatrix[1][1] = 1.0;
- this.internalMatrix[1][2] = 0.0;
- this.internalMatrix[1][3] = 0.0;
- this.internalMatrix[2][0] = -Math.sin(theta);
- this.internalMatrix[2][1] = 0.0;
- this.internalMatrix[2][2] = Math.cos(theta);
- this.internalMatrix[2][3] = 0.0;
- this.internalMatrix[3][0] = 0.0;
- this.internalMatrix[3][1] = 0.0;
- this.internalMatrix[3][2] = 0.0;
- this.internalMatrix[3][3] = 1.0;
- return this;
- }
- /*
- * @Source:
- * http://www.codinglabs.net/article_world_view_projection_matrix.aspx
- */
- public Matrix4 rotateZ(float theta) {
- this.internalMatrix[0][0] = Math.cos(theta);
- this.internalMatrix[0][1] = -Math.sin(theta);
- this.internalMatrix[0][2] = 0.0;
- this.internalMatrix[0][3] = 0.0;
- this.internalMatrix[1][0] = 0.0;
- this.internalMatrix[1][1] = Math.sin(theta);
- this.internalMatrix[1][2] = Math.cos(theta);
- this.internalMatrix[1][3] = 0.0;
- this.internalMatrix[2][0] = 0.0;
- this.internalMatrix[2][1] = 0.0;
- this.internalMatrix[2][2] = 1.0;
- this.internalMatrix[2][3] = 0.0;
- this.internalMatrix[3][0] = 0.0;
- this.internalMatrix[3][1] = 0.0;
- this.internalMatrix[3][2] = 0.0;
- this.internalMatrix[3][3] = 1.0;
- return this;
- }
- /*
- * @Title: 5.2 The normalized matrix for rotations about the origin
- *
- * @Source:
- * https://sites.google.com/site/glennmurray/Home/rotation-matrices-
- * and-formulas/rotation-about-an-arbitrary-axis-in-3-dimensions
- */
- public Matrix4 rotation(float radians, float x, float y, float z) {
- this.internalMatrix[0][0] = Math.pow(x, 2.0) + (((1.0D - Math.pow(x, 2.0)) * Math.cos(radians)));
- this.internalMatrix[0][1] = ((x * y) * (1.0D - Math.cos(radians))) - (z * Math.sin(radians));
- this.internalMatrix[0][2] = (x * z * (1.0D - Math.cos(radians))) + y * Math.sin(radians);
- this.internalMatrix[0][3] = 0.0;
- this.internalMatrix[1][0] = (x * y * (1.0D - Math.cos(radians))) + z * Math.sin(radians);
- this.internalMatrix[1][1] = Math.pow(y, 2) + ((1.0D - Math.pow(y, 2.0)) * Math.cos(radians));
- this.internalMatrix[1][2] = (y * z * (1.0D - Math.cos(radians))) - (x * Math.sin(radians));
- this.internalMatrix[1][3] = 0.0;
- this.internalMatrix[2][0] = (x * z * (1.0D - Math.cos(radians))) - y * Math.sin(radians);
- this.internalMatrix[2][1] = ((y * z) * (1.0D - Math.cos(radians))) + (x * Math.sin(radians));
- this.internalMatrix[2][2] = Math.pow(z, 2.0) + (((1.0D - Math.pow(z, 2.0)) * Math.cos(radians)));
- this.internalMatrix[2][3] = 0.0;
- this.internalMatrix[3][0] = 0.0;
- this.internalMatrix[3][1] = 0.0;
- this.internalMatrix[3][2] = 0.0;
- this.internalMatrix[3][3] = 1.0;
- return this;
- }
- /*
- * 3D Coordinate axes rotation matrices Source:
- * https://sites.google.com/site/glennmurray/Home/rotation-matrices-and-
- * formulas/rotation-about-an-arbitrary-axis-in-3-dimensions
- */
- public Matrix4 rotateXYZ(float alpha, float beta, float gamma) {
- this.internalMatrix[0][0] = Math.cos(beta) * Math.cos(gamma);
- this.internalMatrix[0][1] = -Math.cos(beta) * Math.sin(gamma);
- this.internalMatrix[0][2] = Math.sin(beta);
- this.internalMatrix[0][3] = 0.0;
- this.internalMatrix[1][0] = (Math.cos(alpha) * Math.sin(gamma)) + (Math.sin(alpha) * Math.sin(beta) * Math.cos(gamma));
- this.internalMatrix[1][1] = (Math.cos(alpha) * Math.cos(gamma)) - (Math.sin(alpha) * Math.sin(beta) * Math.sin(gamma));
- this.internalMatrix[1][2] = -(Math.sin(alpha) * Math.cos(beta));
- this.internalMatrix[1][3] = 0.0;
- this.internalMatrix[2][0] = (Math.sin(alpha) * Math.sin(gamma)) - (Math.cos(alpha) * Math.sin(beta) * Math.cos(gamma));
- this.internalMatrix[2][1] = (Math.sin(alpha) * Math.cos(gamma)) + (Math.cos(alpha) * Math.sin(beta) * Math.sin(gamma));
- this.internalMatrix[2][2] = Math.cos(alpha) * Math.cos(beta);
- this.internalMatrix[2][3] = 0.0;
- this.internalMatrix[3][0] = 0.0;
- this.internalMatrix[3][1] = 0.0;
- this.internalMatrix[3][2] = 0.0;
- this.internalMatrix[3][3] = 1.0;
- return this;
- }
- /*
- * 3D Coordinate axes rotation matrices Source:
- * https://sites.google.com/site/glennmurray/Home/rotation-matrices-and-
- * formulas/rotation-about-an-arbitrary-axis-in-3-dimensions
- */
- public Matrix4 rotateZYX(float alpha, float beta, float gamma) {
- this.internalMatrix[0][0] = Math.cos(beta) * Math.cos(gamma);
- this.internalMatrix[0][1] = (Math.cos(gamma) * Math.sin(alpha) * Math.sin(beta)) - (Math.cos(alpha) * Math.sin(gamma));
- this.internalMatrix[0][2] = (Math.cos(alpha) * Math.cos(gamma) * Math.sin(beta)) + (Math.sin(alpha) * Math.sin(gamma));
- this.internalMatrix[0][3] = 0.0;
- this.internalMatrix[1][0] = Math.cos(beta) * Math.sin(gamma);
- this.internalMatrix[1][1] = (Math.cos(alpha) * Math.cos(gamma)) - (Math.sin(alpha) * Math.sin(beta) * Math.sin(gamma));
- this.internalMatrix[1][2] = (-Math.cos(gamma) * Math.sin(alpha)) + (Math.cos(alpha) * Math.sin(beta) * Math.sin(gamma));
- this.internalMatrix[1][3] = 0.0;
- this.internalMatrix[2][0] = -Math.sin(beta);
- this.internalMatrix[2][1] = Math.cos(beta) * Math.sin(alpha);
- this.internalMatrix[2][2] = Math.cos(alpha) * Math.cos(beta);
- this.internalMatrix[2][3] = 0.0;
- this.internalMatrix[3][0] = 0.0;
- this.internalMatrix[3][1] = 0.0;
- this.internalMatrix[3][2] = 0.0;
- this.internalMatrix[3][3] = 1.0;
- return this;
- }
- /*
- * @Source:
- * http://www.codinglabs.net/article_world_view_projection_matrix.aspx
- */
- public Matrix4 translate(double x, double y, double z) {
- this.internalMatrix[3][0] = (this.internalMatrix[0][0] * x + this.internalMatrix[1][0] * y + this.internalMatrix[2][0] * z + this.internalMatrix[3][0]);
- this.internalMatrix[3][1] = (this.internalMatrix[0][1] * x + this.internalMatrix[1][1] * y + this.internalMatrix[2][1] * z + this.internalMatrix[3][1]);
- this.internalMatrix[3][2] = (this.internalMatrix[0][2] * x + this.internalMatrix[1][2] * y + this.internalMatrix[2][2] * z + this.internalMatrix[3][2]);
- this.internalMatrix[3][3] = (this.internalMatrix[0][3] * x + this.internalMatrix[1][3] * y + this.internalMatrix[2][3] * z + this.internalMatrix[3][3]);
- return this;
- }
- public Matrix4 scale(Vertex v) {
- this.identity();
- this.internalMatrix[0][0] = v.getX();
- this.internalMatrix[1][1] = v.getY();
- this.internalMatrix[2][2] = v.getZ();
- this.internalMatrix[3][3] = 1.0D;
- return this;
- }
- public Matrix4 scale(double x, double y, double z) {
- this.identity();
- this.internalMatrix[0][0] = x;
- this.internalMatrix[1][1] = y;
- this.internalMatrix[2][2] = z;
- this.internalMatrix[3][3] = 1.0D;
- return this;
- }
- public double[][] to2DArray() {
- return this.internalMatrix;
- }
- public double[] toArray() {
- double[] temp = new double[16];
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- temp[(i * 4) + j] = this.internalMatrix[i][j];
- }
- }
- return temp;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement