public Matrix4f perspectiveOffCenter(float fovy, float offAngleX, float offAngleY, float aspect, float zNear, float zFar, boolean zZeroToOne, Matrix4f dest) {
        if ((properties & PROPERTY_IDENTITY) != 0)
            return dest.setPerspectiveOffCenter(fovy, offAngleX, offAngleY, aspect, zNear, zFar, zZeroToOne);
        return perspectiveOffCenterGeneric(fovy, offAngleX, offAngleY, aspect, zNear, zFar, zZeroToOne, dest);
    }
public Matrix4f perspectiveOffCenter ( float fovy , float offAngleX , float offAngleY , float aspect , float zNear , float zFar , boolean zZeroToOne , Matrix4f dest ) { if ( ( properties & PROPERTY_IDENTITY ) != 0 ) return dest . setPerspectiveOffCenter ( fovy , offAngleX , offAngleY , aspect , zNear , zFar , zZeroToOne ) ; return perspectiveOffCenterGeneric ( fovy , offAngleX , offAngleY , aspect , zNear , zFar , zZeroToOne , dest ) ; }
Apply an asymmetric off-center perspective projection frustum transformation for a right-handed coordinate system
using the given NDC z range to this matrix and store the result in <code>dest</code>.
<p>
The given angles <code>offAngleX</code> and <code>offAngleY</code> are the horizontal and vertical angles between
the line of sight and the line given by the center of the near and far frustum planes. So, when <code>offAngleY</code>
is just <code>fovy/2</code> then the projection frustum is rotated towards +Y and the bottom frustum plane
is parallel to the XZ-plane.
<p>
If <code>M</code> is <code>this</code> matrix and <code>P</code> the perspective projection matrix,
then the new matrix will be <code>M * P</code>. So when transforming a
vector <code>v</code> with the new matrix by using <code>M * P * v</code>,
the perspective projection will be applied first!
<p>
In order to set the matrix to a perspective frustum transformation without post-multiplying,
use {@link #setPerspectiveOffCenter(float, float, float, float, float, float, boolean) setPerspectiveOffCenter}.

@see #setPerspectiveOffCenter(float, float, float, float, float, float, boolean)

@param fovy
the vertical field of view in radians (must be greater than zero and less than {@link Math#PI PI})
@param offAngleX
the horizontal angle between the line of sight and the line crossing the center of the near and far frustum planes
@param offAngleY
the vertical angle between the line of sight and the line crossing the center of the near and far frustum planes
@param aspect
the aspect ratio (i.e. width / height; must be greater than zero)
@param zNear
near clipping plane distance. If the special value {@link Float#POSITIVE_INFINITY} is used, the near clipping plane will be at positive infinity.
In that case, <code>zFar</code> may not also be {@link Float#POSITIVE_INFINITY}.
@param zFar
far clipping plane distance. If the special value {@link Float#POSITIVE_INFINITY} is used, the far clipping plane will be at positive infinity.
In that case, <code>zNear</code> may not also be {@link Float#POSITIVE_INFINITY}.
@param dest
will hold the result
@param zZeroToOne
whether to use Vulkan's and Direct3D's NDC z range of <code>[0..+1]</code> when <code>true</code>
or whether to use OpenGL's NDC z range of <code>[-1..+1]</code> when <code>false</code>
@return dest