1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| class Camera
{
private :
float Angle1;//horizontal
float Angle2;//vertical
float Distance;
static const Vector3D up;
Vector3D GetPosition()//Position de la camera dans le repère ayant pour origine l'objet fixé.
{
Vector3D Position;
float Distancetmp=Distance;
if(Angle2<0)
Distancetmp=std::min(static_cast<float>(-Center.z/sin(Angle2)), Distance)-0.001;
Position.x=Distancetmp*cos(Angle1)*cos(Angle2);
Position.y=Distancetmp*sin(Angle1)*cos(Angle2);
Position.z=Distancetmp*sin(Angle2);
return Position;
}
public :
Vector3D Center;//Coordonnées de l'objet a fixé dans le repère opengl.
Camera() : Angle1(0), Angle2(0.5), Distance(10){}
void Show()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Vector3D Position=Center+GetPosition();
gluLookAt(Position.x,Position.y,Position.z,Center.x,Center.y,Center.z,0,0,1);
}
void RotateTop(float Angle)
{
Angle*=M_PI/180;
Angle2+=Angle;
if(Angle2<-M_PI/2)
Angle2=-M_PI/2+0.001;
else if(Angle2>M_PI/2)
Angle2=M_PI/2-0.001;
}
void RotateSide(float Angle)
{
Angle*=M_PI/180;
Angle1+=Angle;
}
void Move(const Vector3D& v)
{
float z=Center.z;
Vector3D Position;
Position=GetPosition()*(-1);
Position.z=0;
Center+=Position.GetUnit()*v.x;
Center+=Position.CrossProduct(up).GetUnit()*v.y;
Center.z=z;
}
void Move(float a, float b, float c)
{
Vector3D tmp;
tmp.x=a;
tmp.y=b;
tmp.z=c;
Move(tmp);
}
void IncreaseDistance(float d)
{
Distance+=d;
if(Distance<0)
Distance=0.001;
}
float GetSideAngle() const
{
return Angle1*180/M_PI;
}
Vector3D GetPos()
{
return Center+GetPosition();
}
};
const Vector3D Camera::up(0,0,1); |
Partager