diff options
author | don bright <hugh.m.bright@gmail.com> | 2013-03-03 16:52:25 (GMT) |
---|---|---|
committer | don bright <hugh.m.bright@gmail.com> | 2013-03-03 16:52:25 (GMT) |
commit | 2b2dc7a078e92193f0d27d901d3a1b4af9f5a1d9 (patch) | |
tree | d8c6600a1232e137833b6087a83531edca0af1dc /src/Camera.h | |
parent | bfae32fe9909446cb4254fc5a5d953227736575a (diff) |
make Camera into single class, simplify code
Diffstat (limited to 'src/Camera.h')
-rw-r--r-- | src/Camera.h | 88 |
1 files changed, 46 insertions, 42 deletions
diff --git a/src/Camera.h b/src/Camera.h index 8dd6f68..b35ef0c 100644 --- a/src/Camera.h +++ b/src/Camera.h @@ -1,64 +1,68 @@ #ifndef OPENSCAD_CAMERA_H_ #define OPENSCAD_CAMERA_H_ -// Cameras -// For usage, see GLView.cc / export_png.cc / openscad.cc +/* + +Camera + +For usage, see *View.cc / export_png.cc / openscad.cc + +There are two different types of cameras represented in this class: + +*Gimbal camera - uses Euler Angles, object translation, and viewer distance +*Vector camera - uses 'eye', 'center', and 'up' vectors ('lookat' style) + +*/ #include <vector> #include <Eigen/Geometry> #include <boost/variant.hpp> -class GimbalCamera +class Camera { public: - GimbalCamera() - { - object_trans << 0,0,0; - object_rot << 35,0,25; - viewer_distance = 500; + enum CameraType { NONE, GIMBAL, VECTOR } type; + Camera() { + type = Camera::NONE; } - GimbalCamera( std::vector<double> d ) + Camera( enum CameraType e ) { - assert( d.size() == 7 ); - object_trans << d[0], d[1], d[2]; - object_rot << d[3], d[4], d[5]; - viewer_distance = d[6]; + type = e; + if ( e == Camera::GIMBAL ) { + object_trans << 0,0,0; + object_rot << 35,0,25; + viewer_distance = 500; + } else if ( e == Camera::VECTOR ) { + center << 0,0,0; + Eigen::Vector3d cameradir(1, 1, -0.5); + eye = center - 500 * cameradir; + } } - Eigen::Vector3d object_trans; - Eigen::Vector3d object_rot; - double viewer_distance; -}; -class VectorCamera -{ -public: - VectorCamera() - { - center << 0,0,0; - Eigen::Vector3d cameradir(1, 1, -0.5); - eye = center - 500 * cameradir; - // "up" not currently used - } - VectorCamera( std::vector<double> d ) - { - assert( d.size() == 6 ); - eye << d[0], d[1], d[2]; - center << d[3], d[4], d[5]; + void setup( std::vector<double> params ) { + if ( params.size() == 7 ) { + type = Camera::GIMBAL; + object_trans << params[0], params[1], params[2]; + object_rot << params[3], params[4], params[5]; + viewer_distance = params[6]; + } else if ( params.size() == 6 ) { + type = Camera::VECTOR; + eye << params[0], params[1], params[2]; + center << params[3], params[4], params[5]; + } else { + assert( "Gimbal cam needs 7 numbers, Vector camera needs 6" ); + } } + + // Vectorcam Eigen::Vector3d eye; Eigen::Vector3d center; // (aka 'target') Eigen::Vector3d up; -}; -class Camera -{ -public: - enum CameraType { NONE, GIMBAL, VECTOR } type; - Camera() { type = Camera::NONE; } - void set( VectorCamera &c ) { vcam = c; type = Camera::VECTOR; } - void set( GimbalCamera &c ) { gcam = c; type = Camera::GIMBAL; } - GimbalCamera gcam; - VectorCamera vcam; + // Gimbalcam + Eigen::Vector3d object_trans; + Eigen::Vector3d object_rot; + double viewer_distance; }; |