Package com.jogamp.opengl.math.geom
Class Frustum
- java.lang.Object
-
- com.jogamp.opengl.math.geom.Frustum
-
public class Frustum extends Object
Providing frustumplanes
derived by different inputs (P*MV
, ..) used to classify objects and to test whether they are outsideExtracting the world-frustum planes from the P*Mv:
Fast Extraction of Viewing Frustum Planes from the World-View-Projection Matrix Gil Gribb
Classifying Point, Sphere and AABBox:Klaus Hartmann http://graphics.cs.ucf.edu/cap4720/fall2008/plane_extraction.pdf Efficient View Frustum Culling Daniel Sýkora
Josef Jelínek http://www.cg.tuwien.ac.at/hostings/cescg/CESCG-2002/DSykoraJJelinek/index.html Lighthouse3d.com http://www.lighthouse3d.com/tutorials/view-frustum-culling/
Fundamentals about Planes, Half-Spaces and Frustum-Culling:
Planes and Half-Spaces, Max Wagner
http://www.emeyex.com/site/tuts/PlanesHalfSpaces.pdf Frustum Culling, Max Wagner
http://www.emeyex.com/site/tuts/FrustumCulling.pdf
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
Frustum.FovDesc
static class
Frustum.Location
static class
Frustum.Plane
Plane equation := dot(n, x - p) = 0 -> ax + bc + cx + d == 0
-
Constructor Summary
Constructors Constructor Description Frustum()
Creates an undefined instance w/o calculating the frustum.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description Frustum.Location
classifyPoint(float[] p)
Check to see if a point is outside, inside or on a plane of the frustum.Frustum.Location
classifySphere(float[] p, float radius)
Check to see if a sphere is outside, intersecting or inside of the frustum.Frustum.Plane[]
getPlanes()
boolean
isAABBoxOutside(AABBox box)
Check to see if an axis aligned bounding box is completely outside of the frustum.boolean
isPointOutside(float[] p)
Check to see if a point is outside of the frustum.boolean
isSphereOutside(float[] p, float radius)
Check to see if a sphere is outside of the frustum.String
toString()
StringBuilder
toString(StringBuilder sb)
float[]
updateByFovDesc(float[] m, int m_offset, boolean initM, Frustum.FovDesc fovDesc)
Calculate the frustum planes in world coordinates using the passedFrustum.FovDesc
.void
updateByPlanes(Frustum.Plane[] src)
Copy the givensrc
planes into this this instance's planes.void
updateByPMV(float[] pmv, int pmv_off)
Calculate the frustum planes in world coordinates using the passed float[16] as premultiplied P*MV (column major order).
-
-
-
Field Detail
-
LEFT
public static final int LEFT
Index for left plane: 0- See Also:
- Constant Field Values
-
RIGHT
public static final int RIGHT
Index for right plane: 1- See Also:
- Constant Field Values
-
BOTTOM
public static final int BOTTOM
Index for bottom plane: 2- See Also:
- Constant Field Values
-
TOP
public static final int TOP
Index for top plane: 3- See Also:
- Constant Field Values
-
NEAR
public static final int NEAR
Index for near plane: 4- See Also:
- Constant Field Values
-
FAR
public static final int FAR
Index for far plane: 5- See Also:
- Constant Field Values
-
-
Constructor Detail
-
Frustum
public Frustum()
Creates an undefined instance w/o calculating the frustum.Use one of the
update(..)
methods to set theplanes
.- See Also:
updateByPlanes(Plane[])
,updateByPMV(float[], int)
-
-
Method Detail
-
getPlanes
public final Frustum.Plane[] getPlanes()
Frustum.Plane
s are ordered in the returned array as follows:Frustum.Plane
's normals are pointing to the inside of the frustum in order to work w/isOutside(..)
methods.- Returns:
- array of normalized
Frustum.Plane
s, order see above.
-
updateByPlanes
public final void updateByPlanes(Frustum.Plane[] src)
Copy the givensrc
planes into this this instance's planes.- Parameters:
src
- the 6 source planes
-
updateByFovDesc
public float[] updateByFovDesc(float[] m, int m_offset, boolean initM, Frustum.FovDesc fovDesc)
Calculate the frustum planes in world coordinates using the passedFrustum.FovDesc
.Operation Details:
- The given
Frustum.FovDesc
will be transformed into the given float[16] as a perspective matrix (column major order) first, seeFloatUtil.makePerspective(float[], int, boolean, FovHVHalves, float, float)
. - Then the float[16] perspective matrix is used to
updateByPMV(float[], int)
this instance.
Frustum plane's normals will point to the inside of the viewing frustum, as required by this class.
- Parameters:
m
- 4x4 matrix in column-major order (also result)m_offset
- offset in given array m, i.e. start of the 4x4 matrixinitM
- if true, given matrix will be initialized w/ identity matrix, otherwise only the frustum fields are set.fovDesc
-Frustum
Frustum.FovDesc
- Returns:
- given matrix for chaining
- See Also:
FloatUtil.makePerspective(float[], int, boolean, FovHVHalves, float, float)
- The given
-
updateByPMV
public void updateByPMV(float[] pmv, int pmv_off)
Calculate the frustum planes in world coordinates using the passed float[16] as premultiplied P*MV (column major order).Frustum plane's normals will point to the inside of the viewing frustum, as required by this class.
-
isAABBoxOutside
public final boolean isAABBoxOutside(AABBox box)
Check to see if an axis aligned bounding box is completely outside of the frustum.Note: If method returns false, the box may only be partially inside.
-
classifyPoint
public final Frustum.Location classifyPoint(float[] p)
Check to see if a point is outside, inside or on a plane of the frustum.- Parameters:
p
- the point- Returns:
Frustum.Location
of point related to frustum planes
-
isPointOutside
public final boolean isPointOutside(float[] p)
Check to see if a point is outside of the frustum.- Parameters:
p
- the point- Returns:
- true if outside of the frustum, otherwise inside or on a plane
-
classifySphere
public final Frustum.Location classifySphere(float[] p, float radius)
Check to see if a sphere is outside, intersecting or inside of the frustum.- Parameters:
p
- center of the sphereradius
- radius of the sphere- Returns:
Frustum.Location
of point related to frustum planes
-
isSphereOutside
public final boolean isSphereOutside(float[] p, float radius)
Check to see if a sphere is outside of the frustum.- Parameters:
p
- center of the sphereradius
- radius of the sphere- Returns:
- true if outside of the frustum, otherwise inside or intersecting
-
toString
public StringBuilder toString(StringBuilder sb)
-
-