public static matrix4x4 pointAtMatrix(vector pos, vector target, vector up) { // Calculate new forward direction vector newForward = target - pos; newForward = newForward.normalize(); // Calculate new Up direction vector a = newForward * vector.dot(newForward, up); vector newUp = up - a; newUp = newUp.normalize(); // New Right direction is easy, its just cross product vector newRight = vector.cross(newUp, newForward); // Construct Dimensioning and Translation Matrix matrix4x4 matrix = new matrix4x4(); matrix.m[0, 0] = newRight.x; matrix.m[0, 1] = newRight.y; matrix.m[0, 2] = newRight.z; matrix.m[0, 3] = 0.0f; matrix.m[1, 0] = newUp.x; matrix.m[1, 1] = newUp.y; matrix.m[1, 2] = newUp.z; matrix.m[1, 3] = 0.0f; matrix.m[2, 0] = newForward.x; matrix.m[2, 1] = newForward.y; matrix.m[2, 2] = newForward.z; matrix.m[2, 3] = 0.0f; matrix.m[3, 0] = pos.x; matrix.m[3, 1] = pos.y; matrix.m[3, 2] = pos.z; matrix.m[3, 3] = 1.0f; return(matrix); }
public static matrix4x4 identityMatrix() { matrix4x4 matrix = new matrix4x4(); matrix.m[0, 0] = 1.0f; matrix.m[1, 1] = 1.0f; matrix.m[2, 2] = 1.0f; matrix.m[3, 3] = 1.0f; return(matrix); }
public static matrix4x4 RotationZ(float fAngleRad) { matrix4x4 matrix = new matrix4x4(); matrix.m[0, 0] = MathF.Cos(fAngleRad); matrix.m[0, 1] = MathF.Sin(fAngleRad); matrix.m[1, 0] = -MathF.Sin(fAngleRad); matrix.m[1, 1] = MathF.Cos(fAngleRad); matrix.m[2, 2] = 1.0f; matrix.m[3, 3] = 1.0f; return(matrix); }
public static matrix4x4 translationMatrix(vector v) { matrix4x4 matrix = new matrix4x4(); matrix.m[0, 0] = 1.0f; matrix.m[1, 1] = 1.0f; matrix.m[2, 2] = 1.0f; matrix.m[3, 3] = 1.0f; matrix.m[3, 0] = v.x; matrix.m[3, 1] = v.y; matrix.m[3, 2] = v.z; return(matrix); }
public static matrix4x4 projectionMatrix() { matrix4x4 m = new matrix4x4(); m.m[0, 0] = settings.ratio * settings.fov; m.m[1, 1] = settings.fov; m.m[2, 2] = settings.zFar / (settings.zFar - settings.zNear); m.m[3, 2] = (-settings.zFar * settings.zNear) / (settings.zFar - settings.zNear); m.m[2, 3] = 1.0f; m.m[3, 3] = 0.0f; return(m); }
public static matrix4x4 quickInverseMatrix(matrix4x4 m) { matrix4x4 matrix = new matrix4x4(); matrix.m[0, 0] = m.m[0, 0]; matrix.m[0, 1] = m.m[1, 0]; matrix.m[0, 2] = m.m[2, 0]; matrix.m[0, 3] = 0.0f; matrix.m[1, 0] = m.m[0, 1]; matrix.m[1, 1] = m.m[1, 1]; matrix.m[1, 2] = m.m[2, 1]; matrix.m[1, 3] = 0.0f; matrix.m[2, 0] = m.m[0, 2]; matrix.m[2, 1] = m.m[1, 2]; matrix.m[2, 2] = m.m[2, 2]; matrix.m[2, 3] = 0.0f; matrix.m[3, 0] = -(m.m[3, 0] * matrix.m[0, 0] + m.m[3, 1] * matrix.m[1, 0] + m.m[3, 2] * matrix.m[2, 0]); matrix.m[3, 1] = -(m.m[3, 0] * matrix.m[0, 1] + m.m[3, 1] * matrix.m[1, 1] + m.m[3, 2] * matrix.m[2, 1]); matrix.m[3, 2] = -(m.m[3, 0] * matrix.m[0, 2] + m.m[3, 1] * matrix.m[1, 2] + m.m[3, 2] * matrix.m[2, 2]); matrix.m[3, 3] = 1.0f; return(matrix); }
public static matrix4x4 operator *(matrix4x4 m1, matrix4x4 m2) { matrix4x4 matrix = new matrix4x4(); for (int c = 0; c < 4; c++) { for (int r = 0; r < 4; r++) { matrix.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(matrix); }