Cinder  0.8.6
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
Camera.h
Go to the documentation of this file.
1 /*
2  Copyright (c) 2010, The Barbarian Group
3  All rights reserved.
4 
5  Portions of this code (C) Paul Houx
6  All rights reserved.
7 
8  Redistribution and use in source and binary forms, with or without modification, are permitted provided that
9  the following conditions are met:
10 
11  * Redistributions of source code must retain the above copyright notice, this list of conditions and
12  the following disclaimer.
13  * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
14  the following disclaimer in the documentation and/or other materials provided with the distribution.
15 
16  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
17  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
18  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
19  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
20  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
22  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23  POSSIBILITY OF SUCH DAMAGE.
24 */
25 
26 #pragma once
27 
28 #include "cinder/Vector.h"
29 #include "cinder/Matrix.h"
30 #include "cinder/Quaternion.h"
31 #include "cinder/Ray.h"
32 
33 namespace cinder {
34 
35 // By default the camera is looking down -Z
36 class Camera {
37  public:
38  Camera() : mModelViewCached(false), mProjectionCached(false), mInverseModelViewCached( false ), mWorldUp( Vec3f::yAxis() ) {}
39  virtual ~Camera() {}
40 
41  Vec3f getEyePoint() const { return mEyePoint; }
42  void setEyePoint( const Vec3f &aEyePoint );
43 
44  float getCenterOfInterest() const { return mCenterOfInterest; }
45  void setCenterOfInterest( float aCenterOfInterest ) { mCenterOfInterest = aCenterOfInterest; }
46 
48  void setCenterOfInterestPoint( const Vec3f &centerOfInterestPoint );
49 
50  Vec3f getWorldUp() const { return mWorldUp; }
51  void setWorldUp( const Vec3f &aWorldUp );
52 
53  void lookAt( const Vec3f &target );
54  void lookAt( const Vec3f &aEyePoint, const Vec3f &target );
55  void lookAt( const Vec3f &aEyePoint, const Vec3f &target, const Vec3f &aUp );
57  void setViewDirection( const Vec3f &aViewDirection );
58 
59  Quatf getOrientation() const { return mOrientation; }
60  void setOrientation( const Quatf &aOrientation );
61 
62  float getFov() const { return mFov; }
63  void setFov( float aFov ) { mFov = aFov; mProjectionCached = false; }
64  float getFovHorizontal() const { return toDegrees( 2.0f * math<float>::atan( math<float>::tan( toRadians(mFov) * 0.5f ) * mAspectRatio ) ); }
65  void setFovHorizontal( float aFov ) { mFov = toDegrees( 2.0f * math<float>::atan( math<float>::tan( toRadians(aFov) * 0.5f ) / mAspectRatio ) ); mProjectionCached = false; }
66 
67  float getAspectRatio() const { return mAspectRatio; }
68  void setAspectRatio( float aAspectRatio ) { mAspectRatio = aAspectRatio; mProjectionCached = false; }
69  float getNearClip() const { return mNearClip; }
70  void setNearClip( float aNearClip ) { mNearClip = aNearClip; mProjectionCached = false; }
71  float getFarClip() const { return mFarClip; }
72  void setFarClip( float aFarClip ) { mFarClip = aFarClip; mProjectionCached = false; }
73 
74  virtual void getNearClipCoordinates( Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight ) const;
75  virtual void getFarClipCoordinates( Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight ) const;
76 
78  void getFrustum( float *left, float *top, float *right, float *bottom, float *near, float *far ) const;
80  virtual bool isPersp() const = 0;
81 
82  virtual const Matrix44f& getProjectionMatrix() const { if( ! mProjectionCached ) calcProjection(); return mProjectionMatrix; }
83  virtual const Matrix44f& getModelViewMatrix() const { if( ! mModelViewCached ) calcModelView(); return mModelViewMatrix; }
85 
86  Ray generateRay( float u, float v, float imagePlaneAspectRatio ) const;
87  void getBillboardVectors( Vec3f *right, Vec3f *up ) const;
88 
90  Vec2f worldToScreen( const Vec3f &worldCoord, float screenWidth, float screenHeight ) const;
92  Vec3f worldToEye( const Vec3f &worldCoord ) { return getModelViewMatrix().transformPointAffine( worldCoord ); }
94  float worldToEyeDepth( const Vec3f &worldCoord ) const { return getModelViewMatrix().m[2] * worldCoord.x + getModelViewMatrix().m[6] * worldCoord.y + getModelViewMatrix().m[10] * worldCoord.z + getModelViewMatrix().m[14]; }
96  Vec3f worldToNdc( const Vec3f &worldCoord ) { Vec3f eye = getModelViewMatrix().transformPointAffine( worldCoord ); return getProjectionMatrix().transformPoint( eye ); }
97 
98 
99  float getScreenRadius( const class Sphere &sphere, float screenWidth, float screenHeight ) const;
100 
101  protected:
107 
108  float mFov;
110  float mNearClip;
111  float mFarClip;
112 
113  mutable Vec3f mU; // Right vector
114  mutable Vec3f mV; // Readjust up-vector
115  mutable Vec3f mW; // Negative view direction
116 
118  mutable bool mProjectionCached;
120  mutable bool mModelViewCached;
123 
125 
126  inline void calcMatrices() const;
127 
128  virtual void calcModelView() const;
129  virtual void calcInverseModelView() const;
130  virtual void calcProjection() const = 0;
131 };
132 
133 class CameraPersp : public Camera {
134  public:
135  CameraPersp();
136  CameraPersp( int pixelWidth, int pixelHeight, float fov ); // constructs screen-aligned camera
137  CameraPersp( int pixelWidth, int pixelHeight, float fov, float nearPlane, float farPlane ); // constructs screen-aligned camera
138 
139  void setPerspective( float verticalFovDegrees, float aspectRatio, float nearPlane, float farPlane );
140 
144  void getLensShift( float *horizontal, float *vertical ) const { *horizontal = mLensShift.x; *vertical = mLensShift.y; }
148  Vec2f getLensShift() const { return Vec2f( mLensShift.x, mLensShift.y ); }
152  void setLensShift( float horizontal, float vertical );
156  void setLensShift( const Vec2f &shift ) { setLensShift( shift.x, shift.y ); }
158  float getLensShiftHorizontal() const { return mLensShift.x; }
161  void setLensShiftHorizontal( float horizontal ) { setLensShift( horizontal, mLensShift.y ); }
163  float getLensShiftVertical() const { return mLensShift.y; }
166  void setLensShiftVertical( float vertical ) { setLensShift( mLensShift.x, vertical ); }
167 
168  virtual bool isPersp() const { return true; }
169 
170  CameraPersp getFrameSphere( const class Sphere &worldSpaceSphere, int maxIterations = 20 ) const;
171 
172  protected:
174 
175  virtual void calcProjection() const;
176 };
177 
178 class CameraOrtho : public Camera {
179  public:
180  CameraOrtho();
181  CameraOrtho( float left, float right, float bottom, float top, float nearPlane, float farPlane );
182 
183  void setOrtho( float left, float right, float bottom, float top, float nearPlane, float farPlane );
184 
185  virtual bool isPersp() const { return false; }
186 
187  protected:
188  virtual void calcProjection() const;
189 };
190 
191 class CameraStereo : public CameraPersp {
192  public:
194  : mConvergence(1.0f), mEyeSeparation(0.05f), mIsStereo(false), mIsLeft(true) {}
195  CameraStereo( int pixelWidth, int pixelHeight, float fov )
196  : CameraPersp( pixelWidth, pixelHeight, fov ),
197  mConvergence(1.0f), mEyeSeparation(0.05f), mIsStereo(false), mIsLeft(true) {} // constructs screen-aligned camera
198  CameraStereo( int pixelWidth, int pixelHeight, float fov, float nearPlane, float farPlane )
199  : CameraPersp( pixelWidth, pixelHeight, fov, nearPlane, farPlane ),
200  mConvergence(1.0f), mEyeSeparation(0.05f), mIsStereo(false), mIsLeft(true) {} // constructs screen-aligned camera
201 
203  float getConvergence() const { return mConvergence; }
205  void setConvergence( float distance, bool adjustEyeSeparation=false ) {
206  mConvergence = distance; mProjectionCached = false;
207 
208  if(adjustEyeSeparation)
209  mEyeSeparation = mConvergence / 30.0f;
210  }
212  float getEyeSeparation() const { return mEyeSeparation; }
214  void setEyeSeparation( float distance ) { mEyeSeparation = distance; mModelViewCached = false; mProjectionCached = false; }
216  Vec3f getEyePointShifted() const;
217 
219  void enableStereoLeft() { mIsStereo = true; mIsLeft = true; }
220  bool isStereoLeftEnabled() const { return mIsStereo && mIsLeft; }
222  void enableStereoRight() { mIsStereo = true; mIsLeft = false; }
223  bool isStereoRightEnabled() const { return mIsStereo && !mIsLeft; }
225  void disableStereo() { mIsStereo = false; }
226  bool isStereoEnabled() const { return mIsStereo; }
227 
228  virtual void getNearClipCoordinates( Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight ) const;
229  virtual void getFarClipCoordinates( Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight ) const;
230 
231  virtual const Matrix44f& getProjectionMatrix() const;
232  virtual const Matrix44f& getModelViewMatrix() const;
233  virtual const Matrix44f& getInverseModelViewMatrix() const;
234 
235  protected:
240 
241  virtual void calcModelView() const;
242  virtual void calcInverseModelView() const;
243  virtual void calcProjection() const;
244  private:
245  bool mIsStereo;
246  bool mIsLeft;
247 
248  float mConvergence;
249  float mEyeSeparation;
250 };
251 
252 } // namespace cinder
virtual void getNearClipCoordinates(Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight) const
Definition: Camera.cpp:88
Matrix44f mModelViewMatrixLeft
Definition: Camera.h:238
float getCenterOfInterest() const
Definition: Camera.h:44
float mFrustumBottom
Definition: Camera.h:124
CameraStereo(int pixelWidth, int pixelHeight, float fov)
Definition: Camera.h:195
Definition: CinderMath.h:40
Definition: Camera.h:191
GLdouble GLdouble GLdouble GLdouble top
Definition: GLee.h:13559
bool mInverseModelViewCached
Definition: Camera.h:122
float toDegrees(float x)
Definition: CinderMath.h:137
float getConvergence() const
Returns the current convergence, which is the distance at which there is no parallax.
Definition: Camera.h:203
float getAspectRatio() const
Definition: Camera.h:67
Matrix44f mProjectionMatrix
Definition: Camera.h:117
Quatf getOrientation() const
Definition: Camera.h:59
Matrix44f mInverseModelViewMatrixRight
Definition: Camera.h:239
Vec3f mV
Definition: Camera.h:114
Vec2< float > Vec2f
Definition: Vector.h:1314
Vec3< T > transformPoint(const Vec3< T > &rhs) const
Definition: Matrix44.h:1054
void setOrtho(float left, float right, float bottom, float top, float nearPlane, float farPlane)
Definition: Camera.cpp:371
bool mModelViewCached
Definition: Camera.h:120
float getNearClip() const
Definition: Camera.h:69
float worldToEyeDepth(const Vec3f &worldCoord) const
Converts a world-space coordinate worldCoord to the z axis of eye-space, also known as camera-space...
Definition: Camera.h:94
Vec2f mLensShift
Definition: Camera.h:173
float getEyeSeparation() const
Returns the distance between the camera's for the left and right eyes.
Definition: Camera.h:212
Vec3f getViewDirection() const
Definition: Camera.h:56
virtual void calcModelView() const
Definition: Camera.cpp:527
Matrix44f mInverseModelViewMatrix
Definition: Camera.h:121
T z
Definition: Vector.h:321
T x
Definition: Vector.h:321
Definition: Ray.h:29
Ray generateRay(float u, float v, float imagePlaneAspectRatio) const
Definition: Camera.cpp:128
CameraStereo()
Definition: Camera.h:193
T x
Definition: Vector.h:71
virtual const Matrix44f & getInverseModelViewMatrix() const
Definition: Camera.cpp:514
void setLensShift(float horizontal, float vertical)
Definition: Camera.cpp:312
Vec3f mViewDirection
Definition: Camera.h:103
GLenum target
Definition: GLee.h:13607
T y
Definition: Vector.h:321
bool isStereoRightEnabled() const
Definition: Camera.h:223
virtual void calcProjection() const
Definition: Camera.cpp:563
virtual ~Camera()
Definition: Camera.h:39
T m[16]
Definition: Matrix44.h:66
Vec3f worldToNdc(const Vec3f &worldCoord)
Converts a world-space coordinate worldCoord to normalized device coordinates.
Definition: Camera.h:96
void setFarClip(float aFarClip)
Definition: Camera.h:72
virtual void getFarClipCoordinates(Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight) const
Definition: Camera.cpp:465
float getFovHorizontal() const
Definition: Camera.h:64
Matrix44f mInverseProjectionMatrix
Definition: Camera.h:117
float mFov
Definition: Camera.h:108
Vec2f getLensShift() const
Definition: Camera.h:148
virtual const Matrix44f & getProjectionMatrix() const
Definition: Camera.h:82
Matrix44f mInverseProjectionMatrixLeft
Definition: Camera.h:236
virtual const Matrix44f & getInverseModelViewMatrix() const
Definition: Camera.h:84
Vec3f getWorldUp() const
Definition: Camera.h:50
virtual const Matrix44f & getProjectionMatrix() const
Definition: Camera.cpp:488
Definition: Camera.h:36
void setConvergence(float distance, bool adjustEyeSeparation=false)
Sets the convergence of the camera, which is the distance at which there is no parallax.
Definition: Camera.h:205
bool mProjectionCached
Definition: Camera.h:118
Matrix44f mModelViewMatrixRight
Definition: Camera.h:239
void setCenterOfInterestPoint(const Vec3f &centerOfInterestPoint)
Definition: Camera.cpp:37
Vec3f mU
Definition: Camera.h:113
Vec3f getEyePointShifted() const
Returns the location of the currently enabled eye camera.
Definition: Camera.cpp:433
float mFrustumTop
Definition: Camera.h:124
void setCenterOfInterest(float aCenterOfInterest)
Definition: Camera.h:45
void enableStereoLeft()
Enables the left eye camera.
Definition: Camera.h:219
void setLensShift(const Vec2f &shift)
Definition: Camera.h:156
Matrix44f mModelViewMatrix
Definition: Camera.h:119
virtual const Matrix44f & getModelViewMatrix() const
Definition: Camera.h:83
float getScreenRadius(const class Sphere &sphere, float screenWidth, float screenHeight) const
Definition: Camera.cpp:153
void calcMatrices() const
Definition: Camera.cpp:161
Camera()
Definition: Camera.h:38
void setNearClip(float aNearClip)
Definition: Camera.h:70
void setOrientation(const Quatf &aOrientation)
Definition: Camera.cpp:50
void setPerspective(float verticalFovDegrees, float aspectRatio, float nearPlane, float farPlane)
Definition: Camera.cpp:239
float mFrustumLeft
Definition: Camera.h:124
Vec3f getCenterOfInterestPoint() const
Definition: Camera.h:47
void setEyeSeparation(float distance)
Sets the distance between the camera's for the left and right eyes. This affects the parallax effect...
Definition: Camera.h:214
Matrix44f mProjectionMatrixRight
Definition: Camera.h:237
CameraPersp getFrameSphere(const class Sphere &worldSpaceSphere, int maxIterations=20) const
Definition: Camera.cpp:320
virtual void calcInverseModelView() const
Definition: Camera.cpp:187
Vec3f getEyePoint() const
Definition: Camera.h:41
void setLensShiftHorizontal(float horizontal)
Definition: Camera.h:161
Definition: Sphere.h:32
GLdouble left
Definition: GLee.h:13559
virtual bool isPersp() const
Returns whether the camera represents a perspective projection instead of an orthographic.
Definition: Camera.h:185
float getFov() const
Definition: Camera.h:62
const GLdouble * v
Definition: GLee.h:1384
GLdouble GLdouble right
Definition: GLee.h:13559
void enableStereoRight()
Enables the right eye camera.
Definition: Camera.h:222
void setEyePoint(const Vec3f &aEyePoint)
Definition: Camera.cpp:31
T y
Definition: Vector.h:71
Definition: Camera.h:133
virtual void calcProjection() const
Definition: Camera.cpp:383
void setFov(float aFov)
Definition: Camera.h:63
Vec3f mW
Definition: Camera.h:115
void setFovHorizontal(float aFov)
Definition: Camera.h:65
bool isStereoLeftEnabled() const
Definition: Camera.h:220
float mFrustumRight
Definition: Camera.h:124
Matrix44f mProjectionMatrixLeft
Definition: Camera.h:236
virtual bool isPersp() const
Returns whether the camera represents a perspective projection instead of an orthographic.
Definition: Camera.h:168
Vec3f mEyePoint
Definition: Camera.h:102
float getFarClip() const
Definition: Camera.h:71
float toRadians(float x)
Definition: CinderMath.h:127
Matrix44f mInverseModelViewMatrixLeft
Definition: Camera.h:238
virtual void getFarClipCoordinates(Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight) const
Definition: Camera.cpp:101
bool isStereoEnabled() const
Definition: Camera.h:226
void setAspectRatio(float aAspectRatio)
Definition: Camera.h:68
CameraOrtho()
Definition: Camera.cpp:346
void setWorldUp(const Vec3f &aWorldUp)
Definition: Camera.cpp:57
virtual bool isPersp() const =0
Returns whether the camera represents a perspective projection instead of an orthographic.
float mCenterOfInterest
Definition: Camera.h:105
CameraPersp()
Definition: Camera.cpp:231
void disableStereo()
Disables stereoscopic rendering, converting the camera to a standard CameraPersp. ...
Definition: Camera.h:225
virtual const Matrix44f & getModelViewMatrix() const
Definition: Camera.cpp:501
float mNearClip
Definition: Camera.h:110
virtual void calcInverseModelView() const
Definition: Camera.cpp:553
void lookAt(const Vec3f &target)
Definition: Camera.cpp:64
void getBillboardVectors(Vec3f *right, Vec3f *up) const
Definition: Camera.cpp:138
void setViewDirection(const Vec3f &aViewDirection)
Definition: Camera.cpp:43
GLdouble GLdouble GLdouble bottom
Definition: GLee.h:13559
virtual void calcModelView() const
Definition: Camera.cpp:170
Vec3< T > transformPointAffine(const Vec3< T > &rhs) const
Definition: Matrix44.h:1065
Matrix44f mInverseProjectionMatrixRight
Definition: Camera.h:237
virtual void getNearClipCoordinates(Vec3f *topLeft, Vec3f *topRight, Vec3f *bottomLeft, Vec3f *bottomRight) const
Definition: Camera.cpp:444
float mFarClip
Definition: Camera.h:111
virtual void calcProjection() const =0
virtual void calcProjection() const
Definition: Camera.cpp:249
Quatf mOrientation
Definition: Camera.h:104
Vec3f worldToEye(const Vec3f &worldCoord)
Converts a world-space coordinate worldCoord to eye-space, also known as camera-space. -Z is along the view direction.
Definition: Camera.h:92
Vec2f worldToScreen(const Vec3f &worldCoord, float screenWidth, float screenHeight) const
Converts a world-space coordinate worldCoord to screen coordinates as viewed by the camera...
Definition: Camera.cpp:144
GLclampf f
Definition: GLee.h:15307
void setLensShiftVertical(float vertical)
Definition: Camera.h:166
CameraStereo(int pixelWidth, int pixelHeight, float fov, float nearPlane, float farPlane)
Definition: Camera.h:198
float getLensShiftVertical() const
Returns the vertical lens shift. A vertical lens shift of 1 (-1) will shift the view up (down) by hal...
Definition: Camera.h:163
Vec3f mWorldUp
Definition: Camera.h:106
float mAspectRatio
Definition: Camera.h:109
Definition: Camera.h:178
float getLensShiftHorizontal() const
Returns the horizontal lens shift. A horizontal lens shift of 1 (-1) will shift the view right (left)...
Definition: Camera.h:158
void getLensShift(float *horizontal, float *vertical) const
Definition: Camera.h:144
void getFrustum(float *left, float *top, float *right, float *bottom, float *near, float *far) const
Returns the coordinates of the camera's frustum, suitable for passing to glFrustum.
Definition: Camera.cpp:116