public Matrix4x4 lookAt(Vector3 eye, Vector3 center, Vector3 up) { Vector3 forward = (center.subtract(eye)).normalized(); Vector3 side = Vector3.crossProduct(forward, up).normalized(); Vector3 upVector = Vector3.crossProduct(side, forward); Matrix4x4 m = new Matrix4x4(1); m.set_value(0, 0, side.x()); m.set_value(1, 0, side.y()); m.set_value(2, 0, side.z()); m.set_value(3, 0, 0.0f); m.set_value(0, 1, upVector.x()); m.set_value(1, 1, upVector.y()); m.set_value(2, 1, upVector.z()); m.set_value(3, 1, 0.0f); m.set_value(0, 2, -forward.x()); m.set_value(1, 2, -forward.y()); m.set_value(2, 2, -forward.z()); m.set_value(3, 2, 0.0f); m.set_value(0, 3, 0.0f); m.set_value(1, 3, 0.0f); m.set_value(2, 3, 0.0f); m.set_value(3, 3, 1.0f); Matrix4x4 m2 = this.multiply(m); m2.translate(-eye.x(), -eye.y(), -eye.z()); return m2; }