SG_Camera
—
Agar-SG camera node
#include <agar/core.h>
#include <agar/sg.h>
A SG_Camera
node defines a point of view
inside a
SG(3)
scene-graph. When rendering a scene, the
SG_View(3)
widget is associated with a SG_Camera
node, which
defines both the projection matrix and the initial OpenGL modelview
matrix.
The SG_Camera
class implements
perspective, orthographic and user-specified projection modes.
SG_Camera *
SG_CameraNew
(SG_Node
*parent, const char
*name);
SG_Camera *
SG_CameraNewDuplicate
(SG_Node
*parent, const char
*name, const SG_Camera
*origCam);
The
SG_CameraNew
()
function allocates, initializes, and attaches a new
SG_Camera
object. The
SG_CameraNewDuplicate
() variant initializes the new
camera with the same parameters as camOrig.
Projection transformations are used to map object coordinates to
window coordinates for two-dimensional display devices. Each
SG_Camera
instance is associated with a projection
transformation.
void
SG_CameraGetProjection
(SG_Camera
*cam, M_Matrix44
*P);
void
SG_CameraSetOrthographic
(SG_Camera
*cam);
void
SG_CameraSetPerspective
(SG_Camera
*cam, M_Real fov,
M_Real aspect);
void
SG_CameraSetUser
(SG_Camera
*cam, const M_Matrix44
*Pleft, const M_Matrix44
*Pright);
void
SG_CameraSetClipPlanes
(SG_Camera
*cam, M_Real near,
M_Real far);
void
SG_CameraSetBackPolyMode
(SG_Camera
*cam, const
SG_CameraPolyMode *polymode);
void
SG_CameraSetFacePolyMode
(SG_Camera
*cam, const
SG_CameraPolyMode *polymode);
The
SG_CameraGetProjection
()
function returns the current projection matrix of cam
into P.
The
SG_CameraSetOrthographic
()
function sets the projection matrix of cam to an
orthographic projection matrix.
SG_CameraSetPerspective
() selects a perspective
matrix. For perspective projections, aspect defines
the aspect ratio (ratio of width to height) and fov
defines the field-of-view angle in degrees in the y direction.
The
SG_CameraSetUser
()
function sets the projection matrix of cam to
user-specified matrices Pleft (left eye) and
Pright (right eye). Unless stereo rendering is
activated, only Pleft is used.
The near and far clipping planes are
defined by
SG_CameraSetClipPlanes
().
near and far represent the
distance from the standard XY plane to the near and far clipping planes.
SG_CameraSetBackPolyMode
()
and SG_CameraSetFacePolyMode
() configure the way
back-facing or front-facing polygons are rendered by views using this
camera. The structure is defined as:
typedef struct sg_camera_polymode {
enum {
SG_CAMERA_POINTS, /* Render as points */
SG_CAMERA_WIREFRAME, /* Render in wireframe */
SG_CAMERA_FLAT_SHADED, /* Flat-shaded */
SG_CAMERA_SMOOTH_SHADED /* Smooth-shaded */
} mode;
int cull; /* Cull entirely */
} SG_CameraPolyMode;
void
SG_CameraRotMouse
(SG_Camera
*cam, SG_View *sv,
int xRel,
int yRel);
void
SG_CameraSetRotCtrlCircular
(SG_Camera
*cam, SG_Node
*n);
void
SG_CameraSetRotCtrlElliptic
(SG_Camera
*cam, SG_Node *n1,
SG_Node *n2);
SG_CameraRotMouse
()
is typically invoked by
SG_View(3)
(or a derived widget) to rotate the camera by mouse action.
xRel and yRel are the relative
mouse coordinates since the last mouse motion event.
SG_CameraSetRotCtrlCircular
()
configures the camera such that mouse motion will translate to a circular
orbit around a specified node n. Similarly,
SG_CameraSetRotCtrlElliptic
() arranges for an
elliptic orbit around two specified nodes n1 and
n2.
void
SG_CameraProject
(SG_Camera
*cam);
void
SG_CameraProjectLeft
(SG_Camera
*cam);
void
SG_CameraProjectRight
(SG_Camera
*cam);
void
SG_CameraSetup
(SG_Camera
*cam);
The
SG_CameraProject
()
function multiplies the current projection matrix by the projection matrix
associated with a camera cam. If quad-buffer stereo
project is needed, SG_CameraProjectLeft
() and
SG_CameraProjectRight
() may be called instead.
Functions are used internally by
SG_View(3),
or derivatives of it. The camera object must be locked by the caller.
The
SG_CameraSetup
()
function applies the viewing transformation associated with a camera. As
opposed to SG_CameraProject
() which is only called
on rescale, SG_CameraSetup
() is normally called from
the "draw" function of
SG_View(3)
(or derived widget), prior to rendering the scene. The camera object must be
locked by the caller.
For the SG_Camera
object:
- enum sg_camera_pmode pmode
- Effective projection mode, one of
SG_CAMERA_PERSPECTIVE
,
SG_CAMERA_ORTHOGRAPHIC
or
SG_CAMERA_USER_PROJ
(read-only, use
SG_CameraSetPerspective
(),
SG_CameraSetOrthographic
() or
SG_CameraSetUser
() to set the projection
mode).
- SG_CameraPolyMode polyFace
- Method of rendering for front-facing polygons (read-only, use
SG_CameraSetFacePolyMode
() to set).
- SG_CameraPolyMode polyBack
- Method of rendering for back-facing polygons (read-only, use
SG_CameraSetBackPolyMode
() to set).
- M_Real fov
- Field of view (in radians).
- M_Real aspect
- Aspect ratio.
- M_Real near
- Near clipping plane.
- M_Real far
- Far clipping plane.
- M_Matrix44 userProj
- User-specified projection matrix, usually given by
SG_CameraSetUser
(). The matrix is in column-major
format.
The SG_Camera
node class first appeared in
Agar 1.6.0.