00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef INPUT_FIXED_MANIPULATOR_H
00028 #define INPUT_FIXED_MANIPULATOR_H
00029
00030 #include <osgGA/MatrixManipulator>
00031 #include <PVLE/Util/Util.h>
00032 #include <math.h>
00033
00034
00039 class FixedManipulator : public osgGA::MatrixManipulator {
00040 public:
00041 FixedManipulator() : Dir(-1,-.2,-1), EyePos(50,100,50), Up(0,1,0) {
00042 Dir.normalize();
00043 Up.normalize();
00044
00045 _homeCenter = EyePos;
00046 _homeEye = EyePos + Dir;
00047 _homeUp = Up;
00048 }
00049
00050 FixedManipulator(const osg::Vec3 & EyePos, const osg::Vec3 & Dir, const osg::Vec3 & Up) { setByFrame(EyePos, Dir, Up); }
00051 FixedManipulator(const osg::Matrix & matrix) { setByMatrix(matrix); }
00052
00054 void setByFrame(const osg::Vec3 & EyePos, const osg::Vec3 & Dir, const osg::Vec3 & Up) {
00055 this->EyePos = EyePos;
00056 this->Dir = Dir;
00057 this->Up = Up;
00058
00059 this->Dir.normalize();
00060 this->Up.normalize();
00061 switchLeftRightFrame();
00062 }
00063
00064 virtual void setByMatrix(const osg::Matrix & matrix) {
00065 osg::Vec3 Center;
00066 matrix.getLookAt(EyePos, Center, Up, 1);
00067 Dir = Center - EyePos;
00068 Dir.normalize();
00069 Up.normalize();
00070
00071 switchLeftRightFrame();
00072 }
00073
00074 virtual void setByInverseMatrix(const osg::Matrix & matrix) {
00075 setByMatrix(osg::Matrix::inverse(matrix));
00076 }
00077
00078
00079 virtual osg::Matrix getMatrix() const { return osg::Matrix::inverse(getInverseMatrix()); }
00080
00081 virtual osg::Matrix getInverseMatrix() const {
00082
00083 osg::Vec3 e = EyePos, c = EyePos + Dir, u = Up;
00084 std::swap(e._v[1], e._v[2]);
00085 std::swap(c._v[1], c._v[2]);
00086 std::swap(u._v[1], u._v[2]);
00087 return osg::Matrix::lookAt(e, c, u);
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 }
00098
00099 protected:
00100 osg::Vec3 EyePos, Dir, Up;
00101
00103 void switchLeftRightFrame() {
00104 std::swap(EyePos._v[1], EyePos._v[2]);
00105 std::swap(Dir._v[1], Dir._v[2]);
00106 std::swap(Up._v[1], Up._v[2]);
00107 }
00108 };
00109
00110
00111 #endif // INPUT_FIXED_MANIPULATOR_H