HDK
|
#include <frustum.h>
Public Types | |
enum | ProjectionType { Orthographic, Perspective } |
Public Member Functions | |
GF_API | GfFrustum () |
GfFrustum (GfFrustum const &o) | |
Copy constructor. More... | |
GfFrustum (GfFrustum &&o) noexcept | |
Move constructor. More... | |
GF_API | GfFrustum (const GfVec3d &position, const GfRotation &rotation, const GfRange2d &window, const GfRange1d &nearFar, GfFrustum::ProjectionType projectionType, double viewDistance=5.0) |
GF_API | GfFrustum (const GfMatrix4d &camToWorldXf, const GfRange2d &window, const GfRange1d &nearFar, GfFrustum::ProjectionType projectionType, double viewDistance=5.0) |
GfFrustum & | operator= (GfFrustum const &o) noexcept |
Copy assignment. More... | |
GfFrustum & | operator= (GfFrustum &&o) noexcept |
Move assignment. More... | |
bool | operator== (const GfFrustum &f) const |
bool | operator!= (const GfFrustum &f) const |
GF_API | ~GfFrustum () |
Destructor. More... | |
Convenience methods | |
The methods in this group allow the frustum's data to be accessed and modified in terms of different representations that may be more convenient for certain applications. | |
GF_API void | SetPerspective (double fieldOfViewHeight, double aspectRatio, double nearDistance, double farDistance) |
GF_API void | SetPerspective (double fieldOfView, bool isFovVertical, double aspectRatio, double nearDistance, double farDistance) |
GF_API bool | GetPerspective (double *fieldOfViewHeight, double *aspectRatio, double *nearDistance, double *farDistance) const |
GF_API bool | GetPerspective (bool isFovVertical, double *fieldOfView, double *aspectRatio, double *nearDistance, double *farDistance) const |
GF_API double | GetFOV (bool isFovVertical=false) |
GF_API void | SetOrthographic (double left, double right, double bottom, double top, double nearPlane, double farPlane) |
GF_API bool | GetOrthographic (double *left, double *right, double *bottom, double *top, double *nearPlane, double *farPlane) const |
GF_API void | FitToSphere (const GfVec3d ¢er, double radius, double slack=0.0) |
GF_API GfFrustum & | Transform (const GfMatrix4d &matrix) |
GF_API GfVec3d | ComputeViewDirection () const |
GF_API GfVec3d | ComputeUpVector () const |
GF_API void | ComputeViewFrame (GfVec3d *side, GfVec3d *up, GfVec3d *view) const |
GF_API GfVec3d | ComputeLookAtPoint () const |
GF_API GfMatrix4d | ComputeViewMatrix () const |
GF_API GfMatrix4d | ComputeViewInverse () const |
GF_API GfMatrix4d | ComputeProjectionMatrix () const |
GF_API double | ComputeAspectRatio () const |
GF_API std::vector< GfVec3d > | ComputeCorners () const |
GF_API std::vector< GfVec3d > | ComputeCornersAtDistance (double d) const |
GF_API GfFrustum | ComputeNarrowedFrustum (const GfVec2d &windowPos, const GfVec2d &size) const |
GF_API GfFrustum | ComputeNarrowedFrustum (const GfVec3d &worldPoint, const GfVec2d &size) const |
GF_API GfRay | ComputeRay (const GfVec2d &windowPos) const |
GF_API GfRay | ComputeRay (const GfVec3d &worldSpacePos) const |
GF_API GfRay | ComputePickRay (const GfVec2d &windowPos) const |
GF_API GfRay | ComputePickRay (const GfVec3d &worldSpacePos) const |
Friends | |
size_t | hash_value (const GfFrustum &f) |
Value setting and access | |
The methods in this group set and access the values that are used to define a frustum. | |
void | SetPosition (const GfVec3d &position) |
Sets the position of the frustum in world space. More... | |
const GfVec3d & | GetPosition () const |
Returns the position of the frustum in world space. More... | |
void | SetRotation (const GfRotation &rotation) |
const GfRotation & | GetRotation () const |
GF_API void | SetPositionAndRotationFromMatrix (const GfMatrix4d &camToWorldXf) |
void | SetWindow (const GfRange2d &window) |
const GfRange2d & | GetWindow () const |
Returns the window rectangle in the reference plane. More... | |
void | SetNearFar (const GfRange1d &nearFar) |
Sets the near/far interval. More... | |
const GfRange1d & | GetNearFar () const |
Returns the near/far interval. More... | |
void | SetViewDistance (double viewDistance) |
Sets the view distance. More... | |
double | GetViewDistance () const |
Returns the view distance. More... | |
void | SetProjectionType (GfFrustum::ProjectionType projectionType) |
Sets the projection type. More... | |
GfFrustum::ProjectionType | GetProjectionType () const |
Returns the projection type. More... | |
static double | GetReferencePlaneDepth () |
Returns the depth of the reference plane. More... | |
Intersection methods | |
The methods in this group implement intersection operations between this frustum and a given primitive. | |
GF_API bool | Intersects (const GfBBox3d &bbox) const |
GF_API bool | Intersects (const GfVec3d &point) const |
GF_API bool | Intersects (const GfVec3d &p0, const GfVec3d &p1) const |
GF_API bool | Intersects (const GfVec3d &p0, const GfVec3d &p1, const GfVec3d &p2) const |
static GF_API bool | IntersectsViewVolume (const GfBBox3d &bbox, const GfMatrix4d &vpMat) |
Basic type: View frustum.
This class represents a viewing frustum in three dimensional eye space. It may represent either a parallel (orthographic) or perspective projection. One can think of the frustum as being defined by 6 boundary planes.
The frustum is specified using these parameters:
The window and near/far parameters combine to define the view frustum as follows. Transform the -z axis and the +y axis by the frustum rotation to get the world-space view direction and up direction. Now consider the reference plane that is perpendicular to the view direction, a distance of referencePlaneDepth from the viewpoint, and whose y axis corresponds to the up direction. The window rectangle is specified in a 2D coordinate system embedded in this plane. The origin of the coordinate system is the point at which the view direction vector intersects the plane. Therefore, the point (0,1) in this plane is found by moving 1 unit along the up direction vector in this plane. The vector from the viewpoint to the resulting point will form a 45-degree angle with the view direction.
The view distance is only useful for interactive applications. It can be used to compute a look at point which is useful when rotating around an object of interest.
GF_API GfFrustum::GfFrustum | ( | ) |
This constructor creates an instance with default viewing parameters:
GfFrustum::Perspective
.
|
inline |
|
inlinenoexcept |
GF_API GfFrustum::GfFrustum | ( | const GfVec3d & | position, |
const GfRotation & | rotation, | ||
const GfRange2d & | window, | ||
const GfRange1d & | nearFar, | ||
GfFrustum::ProjectionType | projectionType, | ||
double | viewDistance = 5.0 |
||
) |
This constructor creates an instance with the given viewing parameters.
GF_API GfFrustum::GfFrustum | ( | const GfMatrix4d & | camToWorldXf, |
const GfRange2d & | window, | ||
const GfRange1d & | nearFar, | ||
GfFrustum::ProjectionType | projectionType, | ||
double | viewDistance = 5.0 |
||
) |
This constructor creates an instance from a camera matrix (always of a y-Up camera, also see SetPositionAndRotationFromMatrix) and the given viewing parameters.
GF_API GfFrustum::~GfFrustum | ( | ) |
Destructor.
GF_API double GfFrustum::ComputeAspectRatio | ( | ) | const |
Returns the aspect ratio of the frustum, defined as the width of the window divided by the height. If the height is zero or negative, this returns 0.
Returns the world-space corners of the frustum as a vector of 8 points, ordered as:
Returns the world-space corners of the intersection of the frustum with a plane parallel to the near/far plane at distance d from the apex, ordered as:
Computes and returns the world-space look-at point from the eye point (position), view direction (rotation), and view distance.
GF_API GfFrustum GfFrustum::ComputeNarrowedFrustum | ( | const GfVec2d & | windowPos, |
const GfVec2d & | size | ||
) | const |
Returns a frustum that is a narrowed-down version of this frustum. The new frustum has the same near and far planes, but the other planes are adjusted to be centered on windowPos
with the new width and height obtained from the existing width and height by multiplying by size
[0] and size
[1], respectively. Finally, the new frustum is clipped against this frustum so that it is completely contained in the existing frustum.
windowPos
is given in normalized coords (-1 to +1 in both dimensions). size
is given as a scalar (0 to 1 in both dimensions).
If the windowPos
or size
given is outside these ranges, it may result in returning a collapsed frustum.
This method is useful for computing a volume to use for interactive picking.
GF_API GfFrustum GfFrustum::ComputeNarrowedFrustum | ( | const GfVec3d & | worldPoint, |
const GfVec2d & | size | ||
) | const |
Returns a frustum that is a narrowed-down version of this frustum. The new frustum has the same near and far planes, but the other planes are adjusted to be centered on worldPoint
with the new width and height obtained from the existing width and height by multiplying by size
[0] and size
[1], respectively. Finally, the new frustum is clipped against this frustum so that it is completely contained in the existing frustum.
worldPoint
is given in world space coordinates. size
is given as a scalar (0 to 1 in both dimensions).
If the size
given is outside this range, it may result in returning a collapsed frustum.
If the worldPoint
is at or behind the eye of the frustum, it will return a frustum equal to this frustum.
This method is useful for computing a volume to use for interactive picking.
Builds and returns a GfRay
that can be used for picking at the given normalized (-1 to +1 in both dimensions) window position.
Contrasted with ComputeRay(), that method returns a ray whose origin is the eyepoint, while this method returns a ray whose origin is on the near plane.
Builds and returns a GfRay
that can be used for picking that connects the viewpoint to the given 3d point in worldspace.
GF_API GfMatrix4d GfFrustum::ComputeProjectionMatrix | ( | ) | const |
Returns a GL-style projection matrix corresponding to the frustum's projection.
Builds and returns a GfRay
that starts at the viewpoint and extends through the given windowPos given in normalized coords (-1 to +1 in both dimensions) window position.
Contrasted with ComputePickRay(), this method returns a ray whose origin is the eyepoint, while that method returns a ray whose origin is on the near plane.
Builds and returns a GfRay
that connects the viewpoint to the given 3d point in worldspace.
Contrasted with ComputePickRay(), this method returns a ray whose origin is the eyepoint, while that method returns a ray whose origin is on the near plane.
Returns the normalized world-space up vector, which is computed by rotating the y axis by the frustum's rotation.
Returns the normalized world-space view direction vector, which is computed by rotating the -z axis by the frustum's rotation.
GF_API GfMatrix4d GfFrustum::ComputeViewInverse | ( | ) | const |
Returns a matrix that represents the inverse viewing transformation for this frustum. That is, it returns the matrix that converts points from eye (frustum) space to world space.
GF_API GfMatrix4d GfFrustum::ComputeViewMatrix | ( | ) | const |
Returns a matrix that represents the viewing transformation for this frustum. That is, it returns the matrix that converts points from world space to eye (frustum) space.
Modifies the frustum to tightly enclose a sphere with the given center and radius, using the current view direction. The planes of the frustum are adjusted as necessary. The given amount of slack is added to the sphere's radius is used around the sphere to avoid boundary problems.
GF_API double GfFrustum::GetFOV | ( | bool | isFovVertical = false | ) |
Returns the horizontal or vertical fov of the frustum. The fov of the frustum is not necessarily the same value as displayed in the viewer. The displayed fov is a function of the focal length or FOV avar. The frustum's fov may be different due to things like lens breathing.
If the frustum is not of type GfFrustum::Perspective
, the returned FOV will be 0.0.
isFovVertical
is false so calling GetFOV
without an argument will return the horizontal field of view which is compatible with menv2x's old GfFrustum::GetFOV routine.
|
inline |
GF_API bool GfFrustum::GetOrthographic | ( | double * | left, |
double * | right, | ||
double * | bottom, | ||
double * | top, | ||
double * | nearPlane, | ||
double * | farPlane | ||
) | const |
Returns the current frustum in the format used by SetOrthographic()
. If the current frustum is not an orthographic projection, this returns false
and leaves the parameters untouched.
GF_API bool GfFrustum::GetPerspective | ( | double * | fieldOfViewHeight, |
double * | aspectRatio, | ||
double * | nearDistance, | ||
double * | farDistance | ||
) | const |
Returns the current frustum in the format used by SetPerspective()
. If the current frustum is not a perspective projection, this returns false
and leaves the parameters untouched.
GF_API bool GfFrustum::GetPerspective | ( | bool | isFovVertical, |
double * | fieldOfView, | ||
double * | aspectRatio, | ||
double * | nearDistance, | ||
double * | farDistance | ||
) | const |
Returns the current frustum in the format used by SetPerspective()
. If the current frustum is not a perspective projection, this returns false
and leaves the parameters untouched.
|
inline |
|
inline |
|
inlinestatic |
|
inline |
|
inline |
|
inline |
Returns true if the given axis-aligned bbox is inside or intersecting the frustum. Otherwise, it returns false. Useful when doing picking or frustum culling.
Returns true if the given point is inside or intersecting the frustum. Otherwise, it returns false.
Returns true
if the line segment formed by the given points is inside or intersecting the frustum. Otherwise, it returns false.
GF_API bool GfFrustum::Intersects | ( | const GfVec3d & | p0, |
const GfVec3d & | p1, | ||
const GfVec3d & | p2 | ||
) | const |
Returns true
if the triangle formed by the given points is inside or intersecting the frustum. Otherwise, it returns false.
|
static |
Returns true
if the bbox volume intersects the view volume given by the view-projection matrix, erring on the side of false positives for efficiency.
This method is intended for cases where a GfFrustum is not available or when the view-projection matrix yields a view volume that is not expressable as a GfFrustum.
Because it errs on the side of false positives, it is suitable for early-out tests such as draw or intersection culling.
|
inline |
|
inline |
GF_API void GfFrustum::SetOrthographic | ( | double | left, |
double | right, | ||
double | bottom, | ||
double | top, | ||
double | nearPlane, | ||
double | farPlane | ||
) |
Sets up the frustum in a manner similar to glOrtho()
.
Sets the projection to GfFrustum::Orthographic
and sets the window and near/far specifications based on the given values.
GF_API void GfFrustum::SetPerspective | ( | double | fieldOfViewHeight, |
double | aspectRatio, | ||
double | nearDistance, | ||
double | farDistance | ||
) |
Sets up the frustum in a manner similar to gluPerspective()
.
It sets the projection type to GfFrustum::Perspective
and sets the window specification so that the resulting symmetric frustum encloses an angle of fieldOfViewHeight
degrees in the vertical direction, with aspectRatio
used to figure the angle in the horizontal direction. The near and far distances are specified as well. The window coordinates are computed as:
GF_API void GfFrustum::SetPerspective | ( | double | fieldOfView, |
bool | isFovVertical, | ||
double | aspectRatio, | ||
double | nearDistance, | ||
double | farDistance | ||
) |
Sets up the frustum in a manner similar to gluPerspective().
It sets the projection type to GfFrustum::Perspective
and sets the window specification so that:
If isFovVertical is true, the resulting symmetric frustum encloses an angle of fieldOfView
degrees in the vertical direction, with aspectRatio
used to figure the angle in the horizontal direction.
If isFovVertical is false, the resulting symmetric frustum encloses an angle of fieldOfView
degrees in the horizontal direction, with aspectRatio
used to figure the angle in the vertical direction.
The near and far distances are specified as well. The window coordinates are computed as follows:
GF_API void GfFrustum::SetPositionAndRotationFromMatrix | ( | const GfMatrix4d & | camToWorldXf | ) |
Sets the position and rotation of the frustum from a camera matrix (always from a y-Up camera). The resulting frustum's transform will always represent a right-handed and orthonormal coordinate sytem (scale, shear, and projection are removed from the given camToWorldXf
).
|
inline |
|
inline |
|
inline |
GF_API GfFrustum& GfFrustum::Transform | ( | const GfMatrix4d & | matrix | ) |
Transforms the frustum by the given matrix.
The transformation matrix is applied as follows: the position and the direction vector are transformed with the given matrix. Then the length of the new direction vector is used to rescale the near and far plane and the view distance. Finally, the points that define the reference plane are transformed by the matrix. This method assures that the frustum will not be sheared or perspective-projected.