Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

387 lines
15 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkCamera.h,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkCamera - a virtual camera for 3D rendering
// .SECTION Description
// vtkCamera is a virtual camera for 3D rendering. It provides methods
// to position and orient the view point and focal point. Convenience
// methods for moving about the focal point also are provided. More
// complex methods allow the manipulation of the computer graphics
// model including view up vector, clipping planes, and
// camera perspective.
// .SECTION See Also
// vtkPerspectiveTransform
#ifndef __vtkCamera_h
#define __vtkCamera_h
#include "vtkObject.h"
class vtkMatrix4x4;
class vtkPerspectiveTransform;
class vtkRenderer;
class vtkTransform;
class vtkHomogeneousTransform;
class VTK_RENDERING_EXPORT vtkCamera : public vtkObject
{
public:
void PrintSelf(ostream& os, vtkIndent indent);
vtkTypeRevisionMacro(vtkCamera,vtkObject);
// Description:
// Construct camera instance with its focal point at the origin,
// and position=(0,0,1). The view up is along the y-axis,
// view angle is 30 degrees, and the clipping range is (.1,1000).
static vtkCamera *New();
// Description:
// Set/Get the position of the camera in world coordinates.
// The default position is (0,0,1).
void SetPosition(double x, double y, double z);
void SetPosition(const double a[3]) {
this->SetPosition(a[0], a[1], a[2]); };
vtkGetVector3Macro(Position,double);
// Description:
// Set/Get the focal of the camera in world coordinates.
// The default focal point is the origin.
void SetFocalPoint(double x, double y, double z);
void SetFocalPoint(const double a[3]) {
this->SetFocalPoint(a[0], a[1], a[2]);};
vtkGetVector3Macro(FocalPoint,double);
// Description:
// Set/Get the view up direction for the camera. The default
// is (0,1,0).
void SetViewUp(double vx, double vy, double vz);
void SetViewUp(const double a[3]) {
this->SetViewUp(a[0], a[1], a[2]); }
vtkGetVector3Macro(ViewUp,double);
// Description:
// Recompute the ViewUp vector to force it to be perpendicular to
// camera->focalpoint vector. Unless you are going to use
// Yaw or Azimuth on the camera, there is no need to do this.
void OrthogonalizeViewUp();
// Description:
// Move the focal point so that it is the specified distance from
// the camera position. This distance must be positive.
void SetDistance(double);
// Description:
// Return the distance from the camera position to the focal point.
// This distance is positive.
vtkGetMacro(Distance,double);
// Description:
// Get the vector in the direction from the camera position to the
// focal point. This is usually the opposite of the ViewPlaneNormal,
// the vector perpendicular to the screen, unless the view is oblique.
vtkGetVector3Macro(DirectionOfProjection,double);
// Description:
// Move the position of the camera along the direction of projection. Moving
// towards the focal point (e.g., greater than 1) is a dolly-in, moving away
// from the focal point (e.g., less than 1) is a dolly-out.
void Dolly(double distance);
// Description:
// Set the roll angle of the camera about the direction of projection.
void SetRoll(double angle);
double GetRoll();
// Description:
// Rotate the camera about the direction of projection.
void Roll(double angle);
// Description:
// Rotate the camera about the view up vector centered at the focal point.
// Note that the view up vector is not necessarily perpendicular to the
// direction of projection.
void Azimuth(double angle);
// Description:
// Rotate the focal point about the view up vector centered at the camera's
// position. Note that the view up vector is not necessarily perpendicular
// to the direction of projection.
void Yaw(double angle);
// Description:
// Rotate the camera about the cross product of the direction of projection
// and the view up vector centered on the focal point.
void Elevation(double angle);
// Description:
// Rotate the focal point about the cross product of the view up vector
// and the direction of projection, centered at the camera's position.
void Pitch(double angle);
// Description:
// Set/Get the value of the ParallelProjection instance variable. This
// determines if the camera should do a perspective or parallel projection.
void SetParallelProjection(int flag);
vtkGetMacro(ParallelProjection,int);
vtkBooleanMacro(ParallelProjection,int);
// Description:
// Set/Get the value of the UseHorizontalViewAngle instance variable. If
// set, the camera's view angle represents a horizontal view angle, rather
// than the default vertical view angle. This is useful if the application
// uses a display device which whose specs indicate a particular horizontal
// view angle, or if the application varies the window height but wants to
// keep the perspective transform unchanges.
void SetUseHorizontalViewAngle(int flag);
vtkGetMacro(UseHorizontalViewAngle, int);
vtkBooleanMacro(UseHorizontalViewAngle, int);
// Description:
// Set/Get the camera view angle, which is the angular height of the
// camera view measured in degrees. The default angle is 30 degrees.
// This method has no effect in parallel projection mode.
// The formula for setting the angle up for perfect perspective viewing
// is: angle = 2*atan((h/2)/d) where h is the height of the RenderWindow
// (measured in mm by holding a ruler up to your screen) and d is the
// distance from your eyes to the screen.
void SetViewAngle(double angle);
vtkGetMacro(ViewAngle,double);
// Description:
// Set/Get the scaling used for a parallel projection, i.e. the height
// of the viewport in world-coordinate distances. The default is 1.
// Note that the "scale" parameter works as an "inverse scale" ---
// larger numbers produce smaller images.
// This method has no effect in perspective projection mode.
void SetParallelScale(double scale);
vtkGetMacro(ParallelScale,double);
// Description:
// In perspective mode, decrease the view angle by the specified factor.
// In parallel mode, decrease the parallel scale by the specified factor.
// A value greater than 1 is a zoom-in, a value less than 1 is a zoom-out.
void Zoom(double factor);
// Description:
// Set/Get the location of the near and far clipping planes along the
// direction of projection. Both of these values must be positive.
// How the clipping planes are set can have a large impact on how
// well z-buffering works. In particular the front clipping
// plane can make a very big difference. Setting it to 0.01 when it
// really could be 1.0 can have a big impact on your z-buffer resolution
// farther away. The default clipping range is (0.1,1000).
void SetClippingRange(double dNear, double dFar);
void SetClippingRange(const double a[2]) {
this->SetClippingRange(a[0], a[1]); };
vtkGetVector2Macro(ClippingRange,double);
// Description:
// Set the distance between clipping planes. This method adjusts the
// far clipping plane to be set a distance 'thickness' beyond the
// near clipping plane.
void SetThickness(double);
vtkGetMacro(Thickness,double);
// Description:
// Set/Get the center of the window in viewport coordinates.
// The viewport coordinate range is ([-1,+1],[-1,+1]). This method
// is for if you have one window which consists of several viewports,
// or if you have several screens which you want to act together as
// one large screen.
void SetWindowCenter(double x, double y);
vtkGetVector2Macro(WindowCenter,double);
// Description:
// Get/Set the oblique viewing angles. The first angle, alpha, is the
// angle (measured from the horizontal) that rays along the direction
// of projection will follow once projected onto the 2D screen.
// The second angle, beta, is the angle between the view plane and
// the direction of projection. This creates a shear transform
// x' = x + dz*cos(alpha)/tan(beta), y' = dz*sin(alpha)/tan(beta)
// where dz is the distance of the point from the focal plane.
// The angles are (45,90) by default. Oblique projections
// commonly use (30,63.435).
void SetObliqueAngles(double alpha, double beta);
// Description:
// Apply a transform to the camera. The camera position, focal-point,
// and view-up are re-calulated using the transform's matrix to
// multiply the old points by the new transform.
void ApplyTransform(vtkTransform *t);
// Description:
// Get the ViewPlaneNormal. This vector will point opposite to
// the direction of projection, unless you have created an sheared output
// view using SetViewShear/SetObliqueAngles.
vtkGetVector3Macro(ViewPlaneNormal,double);
// Description:
// Set/get the shear transform of the viewing frustum. Parameters are
// dx/dz, dy/dz, and center. center is a factor that describes where
// to shear around. The distance dshear from the camera where
// no shear occurs is given by (dshear = center * FocalDistance).
void SetViewShear(double dxdz, double dydz, double center);
void SetViewShear(double d[3]);
vtkGetVector3Macro(ViewShear, double);
// Description:
// Set/Get the separation between eyes (in degrees). This is used
// when generating stereo images.
vtkSetMacro(EyeAngle,double);
vtkGetMacro(EyeAngle,double);
// Description:
// Set the size of the cameras lens in world coordinates. This is only
// used when the renderer is doing focal depth rendering. When that is
// being done the size of the focal disk will effect how significant the
// depth effects will be.
vtkSetMacro(FocalDisk,double);
vtkGetMacro(FocalDisk,double);
// Description:
// Return the matrix of the view transform.
virtual vtkMatrix4x4 *GetViewTransformMatrix();
// Description:
// Return the perspective transform matrix, which converts from camera
// coordinates to viewport coordinates. The 'aspect' is the
// width/height for the viewport, and the nearz and farz are the
// Z-buffer values that map to the near and far clipping planes.
// The viewport coordinates are in the range ([-1,+1],[-1,+1],[nearz,farz]).
virtual vtkMatrix4x4 *GetPerspectiveTransformMatrix(double aspect,
double nearz,
double farz);
// Description:
// Return the concatenation of the ViewTransform and the
// PerspectiveTransform. This transform will convert world
// coordinates to view coordinates. The 'aspect' is the
// width/height for the viewport, and the nearz and farz are the
// Z-buffer values that map to the near and far clipping planes.
// The view coordinates are in the range ([-1,+1],[-1,+1],[nearz,farz]).
virtual vtkMatrix4x4 *GetCompositePerspectiveTransformMatrix(double aspect,
double nearz,
double farz);
// Description:
// In addition to the instance variables such as position and orientation,
// you can add an additional transformation for your own use. This
// transformation is concatenated to the camera's PerspectiveTransform
void SetUserTransform(vtkHomogeneousTransform *transform);
vtkGetObjectMacro(UserTransform,vtkHomogeneousTransform);
// Description:
// This method causes the camera to set up whatever is required for
// viewing the scene. This is actually handled by an subclass of
// vtkCamera, which is created through New()
virtual void Render(vtkRenderer *) {};
// Description:
// Return the MTime that concerns recomputing the view rays of the camera.
unsigned long GetViewingRaysMTime();
// Description:
// Mark that something has changed which requires the view rays
// to be recomputed.
void ViewingRaysModified();
// Description:
// Get the plane equations that bound the view frustum.
// The plane normals point inward. The planes array contains six
// plane equations of the form (Ax+By+Cz+D=0), the first four
// values are (A,B,C,D) which repeats for each of the planes.
// The aspect of the viewport is needed to correctly compute the planes
virtual void GetFrustumPlanes(double aspect, double planes[24]);
// Description:
// Get the orientation of the camera.
double *GetOrientation();
double *GetOrientationWXYZ();
// Description:
// These methods have been deprecated. The view plane normal is
// automatically set from the DirectionOfProjection according to
// the ViewShear.
void SetViewPlaneNormal(double x, double y, double z);
void SetViewPlaneNormal(const double a[3]) {
this->SetViewPlaneNormal(a[0], a[1], a[2]); };
// Description:
// This method is called automatically whenever necessary, it
// should never be used outside of vtkCamera.cxx.
void ComputeViewPlaneNormal();
// Description:
// Returns a transformation matrix for a coordinate frame attached to
// the camera, where the camera is located at (0, 0, 1) looking at the
// focal point at (0, 0, 0), with up being (0, 1, 0).
vtkMatrix4x4 *GetCameraLightTransformMatrix();
// Description:
// Update the viewport
virtual void UpdateViewport(vtkRenderer *vtkNotUsed(ren)) {}
virtual vtkTransform *GetViewTransformObject() {return this->ViewTransform;};
protected:
vtkCamera();
~vtkCamera();
// Description:
// These methods should only be used within vtkCamera.cxx.
void ComputeDistance();
void ComputeViewTransform();
void ComputePerspectiveTransform(double aspect, double nearz, double farz);
void ComputeCompositePerspectiveTransform(double aspect,
double nearz, double farz);
void ComputeCameraLightTransform();
double WindowCenter[2];
double ObliqueAngles[2];
double FocalPoint[3];
double Position[3];
double ViewUp[3];
double ViewAngle;
double ClippingRange[2];
double EyeAngle;
int ParallelProjection;
double ParallelScale;
int Stereo;
int LeftEye;
double Thickness;
double Distance;
double DirectionOfProjection[3];
double ViewPlaneNormal[3];
double ViewShear[3];
int UseHorizontalViewAngle;
vtkHomogeneousTransform *UserTransform;
vtkTransform *ViewTransform;
vtkPerspectiveTransform *PerspectiveTransform;
vtkPerspectiveTransform *Transform;
vtkTransform *CameraLightTransform;
double FocalDisk;
// ViewingRaysMtime keeps track of camera modifications which will
// change the calculation of viewing rays for the camera before it is
// transformed to the camera's location and orientation.
vtkTimeStamp ViewingRaysMTime;
private:
vtkCamera(const vtkCamera&); // Not implemented.
void operator=(const vtkCamera&); // Not implemented.
};
#endif