Transform Transform::LookAt(const Vector3 &pos, const Vector3 &look, const Vector3 &up) { Matrix4x4 camToWorld; // Initialize fourth column of viewing matrix camToWorld.matrix[0][3] = pos.x; camToWorld.matrix[1][3] = pos.y; camToWorld.matrix[2][3] = pos.z; camToWorld.matrix[3][3] = 1; // Initialize first three columns of viewing matrix Vector3 dir, temp_up; Vector3::Normalize(look - pos, dir); Vector3::Normalize(up, temp_up); Vector3 left; Vector3::Normalize(Vector3::Cross(temp_up, dir),left); Vector3 newUp = Vector3::Cross(dir, left); camToWorld.matrix[0][0] = left.x; camToWorld.matrix[1][0] = left.y; camToWorld.matrix[2][0] = left.z; camToWorld.matrix[3][0] = 0.; camToWorld.matrix[0][1] = newUp.x; camToWorld.matrix[1][1] = newUp.y; camToWorld.matrix[2][1] = newUp.z; camToWorld.matrix[3][1] = 0.; camToWorld.matrix[0][2] = dir.x; camToWorld.matrix[1][2] = dir.y; camToWorld.matrix[2][2] = dir.z; camToWorld.matrix[3][2] = 0.; return Transform(camToWorld.Inverse(), camToWorld); }
Transform::Transform(Matrix4x4& p_mat) : matrix(p_mat), matrix_inverse(p_mat.Inverse()){}