Contents User Forum Source Index APIs by Task APIs by Level Data


G3D::GCamera Class Reference

Abstraction of a pinhole camera. More...

#include <GCamera.h>

List of all members.

Public Types

enum  FOVDirection { HORIZONTAL, VERTICAL }

Public Member Functions

Vector3 convertFromUnitToNormal (const Vector3 &in, Rect2D viewport) const
const CoordinateFramecoordinateFrame () const
void deserialize (class BinaryInput &bi)
float farPlaneZ () const
GCamera::Frustum frustum (const Rect2D &viewport) const
void frustum (const Rect2D &viewport, GCamera::Frustum &f) const
 GCamera ()
void getClipPlanes (const Rect2D &viewport, Array< Plane > &outClip) const
void getCoordinateFrame (CoordinateFrame &c) const
void getFarViewportCorners (const class Rect2D &viewport, Vector3 &outUR, Vector3 &outUL, Vector3 &outLL, Vector3 &outLR) const
void getFieldOfView (float &angle, FOVDirection &direction) const
void getNearViewportCorners (const class Rect2D &viewport, Vector3 &outUR, Vector3 &outUL, Vector3 &outLL, Vector3 &outLR) const
void getProjectUnitMatrix (const Rect2D &viewport, Matrix4 &P) const
float imagePlaneDepth () const
void lookAt (const Vector3 &position, const Vector3 &up=Vector3::unitY())
float nearPlaneZ () const
Vector3 project (const G3D::Vector3 &point, const class Rect2D &viewport) const
Vector3 projectUnit (const G3D::Vector3 &point, const class Rect2D &viewport) const
void serialize (class BinaryOutput &bo) const
void setCoordinateFrame (const CoordinateFrame &c)
void setFarPlaneZ (float z)
void setFieldOfView (float angle, FOVDirection direction)
void setNearPlaneZ (float z)
void setPosition (const Vector3 &t)
Vector3 unproject (const Vector3 &v, const Rect2D &viewport) const
Vector3 unprojectUnit (const Vector3 &v, const Rect2D &viewport) const
float viewportHeight (const class Rect2D &viewport) const
float viewportWidth (const class Rect2D &viewport) const
Ray worldRay (float x, float y, const class Rect2D &viewport) const
float worldToScreenSpaceArea (float area, float z, const class Rect2D &viewport) const
virtual ~GCamera ()

Classes

class  Frustum


Detailed Description

Abstraction of a pinhole camera.

The area a camera sees is called a frustum. It is bounded by the near plane, the far plane, and the sides of the view frame projected into the scene. It has the shape of a pyramid with the top cut off.

Cameras can project points from 3D to 2D. The "unit" projection matches OpenGL. It maps the entire view frustum to a cube of unit radius (i.e., edges of length 2) centered at the origin. The non-unit projection then maps that cube to the specified pixel viewport in X and Y and the range [0, 1] in Z. The projection is reversable as long as the projected Z value is known.

All viewport arguments are the pixel bounds of the viewport-- e.g., RenderDevice::viewport().


Member Enumeration Documentation

Stores the direction of the field of view.

Enumerator:
HORIZONTAL 
VERTICAL 


Constructor & Destructor Documentation

G3D::GCamera::GCamera (  ) 

virtual G3D::GCamera::~GCamera (  )  [virtual]


Member Function Documentation

Vector3 G3D::GCamera::convertFromUnitToNormal ( const Vector3 in,
Rect2D  viewport 
) const

Converts projected points from OpenGL standards (-1, 1) to normal 3D coordinate standards (0, 1).

const CoordinateFrame& G3D::GCamera::coordinateFrame (  )  const [inline]

Returns the current coordinate frame.

void G3D::GCamera::deserialize ( class BinaryInput bi  ) 

float G3D::GCamera::farPlaneZ (  )  const [inline]

Returns a negative z-value.

GCamera::Frustum G3D::GCamera::frustum ( const Rect2D viewport  )  const

void G3D::GCamera::frustum ( const Rect2D viewport,
GCamera::Frustum f 
) const

Returns the world space view frustum, which is a truncated pyramid describing the volume of space seen by this camera.

void G3D::GCamera::getClipPlanes ( const Rect2D viewport,
Array< Plane > &  outClip 
) const

Returns the clipping planes of the frustum, in world space.

The planes have normals facing into the view frustum.

The plane order is guaranteed to be: Near, Right, Left, Top, Bottom, [Far]

If the far plane is at infinity, the resulting array will have 5 planes, otherwise there will be 6.

The viewport is used only to determine the aspect ratio of the screen; the absolute dimensions and xy values don't matter.

void G3D::GCamera::getCoordinateFrame ( CoordinateFrame c  )  const

Sets c to the camera's coordinate frame.

void G3D::GCamera::getFarViewportCorners ( const class Rect2D viewport,
Vector3 outUR,
Vector3 outUL,
Vector3 outLL,
Vector3 outLR 
) const

Returns the world space 3D viewport corners.

These are at the Far clipping plane. The corners are constructed from the nearPlaneZ, farPlaneZ, viewportWidth, and viewportHeight. "left" and "right" are from the GCamera's perspective.

void G3D::GCamera::getFieldOfView ( float &  angle,
FOVDirection direction 
) const [inline]

Returns the current field of view angle and direction.

void G3D::GCamera::getNearViewportCorners ( const class Rect2D viewport,
Vector3 outUR,
Vector3 outUL,
Vector3 outLL,
Vector3 outLR 
) const

Returns the world space 3D viewport corners.

These are at the near clipping plane. The corners are constructed from the nearPlaneZ, viewportWidth, and viewportHeight. "left" and "right" are from the GCamera's perspective.

void G3D::GCamera::getProjectUnitMatrix ( const Rect2D viewport,
Matrix4 P 
) const

Sets P equal to the camera's projection matrix.

float G3D::GCamera::imagePlaneDepth (  )  const

Returns the image plane depth, assumes imagePlane is the same as the near clipping plane.

returns a positive number.

void G3D::GCamera::lookAt ( const Vector3 position,
const Vector3 up = Vector3::unitY() 
)

Rotate the camera in place to look at the target.

Does not persistently look at that location when the camera moves; i.e., if you move the camera and still want it to look at the old target, you must call lookAt again after moving the camera.)

float G3D::GCamera::nearPlaneZ (  )  const [inline]

Returns a negative z-value.

Vector3 G3D::GCamera::project ( const G3D::Vector3 point,
const class Rect2D viewport 
) const

Projects a world space point onto a width x height screen.

The returned coordinate uses pixmap addressing: x = right and y = down. The resulting z value is 0 at the near plane, 1 at the far plane, and is a linear compression of unit cube projection.

If the point is behind the camera, Vector3::inf() is returned.

Vector3 G3D::GCamera::projectUnit ( const G3D::Vector3 point,
const class Rect2D viewport 
) const

Projects a world space point onto a unit cube.

The resulting x,y,z values range between -1 and 1, where z is -1 at the near plane and 1 at the far plane and varies hyperbolically in between.

If the point is behind the camera, Vector3::inf() is returned.

void G3D::GCamera::serialize ( class BinaryOutput bo  )  const

Read and Write camera parameters.

void G3D::GCamera::setCoordinateFrame ( const CoordinateFrame c  ) 

Sets a new coordinate frame for the camera.

void G3D::GCamera::setFarPlaneZ ( float  z  )  [inline]

Sets a new value for the far clipping plane Expects a negative value.

void G3D::GCamera::setFieldOfView ( float  angle,
FOVDirection  direction 
)

Sets the vertical field of view, in radians.

The initial angle is toRadians(55). Must specify the direction of the angle

void G3D::GCamera::setNearPlaneZ ( float  z  )  [inline]

Sets a new value for the near clipping plane Expects a negative value.

void G3D::GCamera::setPosition ( const Vector3 t  ) 

Vector3 G3D::GCamera::unproject ( const Vector3 v,
const Rect2D viewport 
) const

Gives the world-space coordinates of screen space point v, where v.x is in pixels from the left, v.y is in pixels from the top, and v.z is on the range 0 (near plane) to 1 (far plane).

Vector3 G3D::GCamera::unprojectUnit ( const Vector3 v,
const Rect2D viewport 
) const

Gives the world-space coordinates of unit cube point v, where v varies from -1 to 1 on all axes.

The unproject first transforms the point into a pixel location for the viewport, then calls unproject

float G3D::GCamera::viewportHeight ( const class Rect2D viewport  )  const

Returns the camera space height of the viewport at the near plane.

float G3D::GCamera::viewportWidth ( const class Rect2D viewport  )  const

Returns the camera space width of the viewport at the near plane.

Ray G3D::GCamera::worldRay ( float  x,
float  y,
const class Rect2D viewport 
) const

Returns the world space ray passing through the center of pixel (x, y) on the image plane.

The pixel x and y axes are opposite the 3D object space axes: (0,0) is the upper left corner of the screen. They are in viewport coordinates, not screen coordinates.

The ray origin is at the origin. To start it at the image plane, move it forward by imagePlaneDepth/ray.direction.z

Integer (x, y) values correspond to the upper left corners of pixels. If you want to cast rays through pixel centers, add 0.5 to x and y.

float G3D::GCamera::worldToScreenSpaceArea ( float  area,
float  z,
const class Rect2D viewport 
) const

Returns the pixel area covered by a shape of the given world space area at the given z value (z must be negative).


The documentation for this class was generated from the following file:
Generated on Thu Aug 2 11:40:45 2007 for G3D by doxygen 1.5.2
Hosted by SourceForge.net Logo