code: public Matrix4d rotateTowards(double dirX, double dirY, double dirZ, double upX, double upY, double upZ) {
          return rotateTowards(dirX, dirY, dirZ, upX, upY, upZ, this);
      }
docs: Apply a model transformation to this matrix for a right-handed coordinate system,
  that aligns the local <code>+Z</code> axis with <code>(dirX, dirY, dirZ)</code>.
  <p>
  If <code>M</code> is <code>this</code> matrix and <code>L</code> the lookat matrix,
  then the new matrix will be <code>M * L</code>. So when transforming a
  vector <code>v</code> with the new matrix by using <code>M * L * v</code>,
  the lookat transformation will be applied first!
  <p>
  In order to set the matrix to a rotation transformation without post-multiplying it,
  use {@link #rotationTowards(double, double, double, double, double, double) rotationTowards()}.
  <p>
  This method is equivalent to calling: <code>mulAffine(new Matrix4d().lookAt(0, 0, 0, -dirX, -dirY, -dirZ, upX, upY, upZ).invertAffine())</code>
  
  @see #rotateTowards(Vector3dc, Vector3dc)
  @see #rotationTowards(double, double, double, double, double, double)
  
  @param dirX
  the x-coordinate of the direction to rotate towards
  @param dirY
  the y-coordinate of the direction to rotate towards
  @param dirZ
  the z-coordinate of the direction to rotate towards
  @param upX
  the x-coordinate of the up vector
  @param upY
  the y-coordinate of the up vector
  @param upZ
  the z-coordinate of the up vector
  @return this