code: public static <A, B> PMatrix4x4D<A, B> perspectiveProjectionRHP(
      final double z_near,
      final double z_far,
      final double aspect,
      final double horizontal_fov)
    {
      final double x_max = z_near * StrictMath.tan(horizontal_fov / 2.0);
      final double x_min = -x_max;
      final double y_max = x_max / aspect;
      final double y_min = -y_max;
      return frustumProjectionRHP(x_min, x_max, y_min, y_max, z_near, z_far);
    }
docs: <p>Calculate a matrix that will produce a perspective projection based on
  the given view frustum parameters, the aspect ratio of the viewport and a
  given horizontal field of view in radians. Note that {@code fov_radians}
  represents the full horizontal field of view: the angle at the base of the
  triangle formed by the frustum on the {@code x/z} plane.</p>
  
  <p>Note that iff {@code z_far &gt;= Double.POSITIVE_INFINITY}, the
  function produces an "infinite projection matrix", suitable for use in code
  that deals with shadow volumes.</p>
  
  <p>The function assumes a right-handed coordinate system.</p>
  
  <p>See
  <a href="http://http.developer.nvidia.com/GPUGems/gpugems_ch09.html">GPU
  Gems</a></p>
  
  @param z_near         The near clipping plane coordinate
  @param z_far          The far clipping plane coordinate
  @param aspect         The aspect ratio of the viewport; the width divided
  by the height. For example, an aspect ratio of 2.0
  indicates a viewport twice as wide as it is high
  @param horizontal_fov The horizontal field of view in radians
  @param <A>            A phantom type parameter, possibly representing a
  source coordinate system
  @param <B>            A phantom type parameter, possibly representing a
  target coordinate system
  
  @return A perspective projection matrix