Camera, et Optimisation en utilisant la carte graphique
Bonjour à tous, j'essaie de me déplacer dans une scène importée (au format .obj) et le calcul nécessaire à ma camera commence a prendre du temps (je tourne a 20 fps avec camera et 40 sans).
Aujourd'hui, voici le code de ma camera (j'utilise les coordonnées sphériques).
Code:
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); |
Comme vous voyez, tous mes calculs sont fait par le processeur. Est-il possible de les faire faire facilement par la carte graphique avec glRotate et glTranslate ? Si oui, comment ? Il faudrait que je puisse garder les mêmes fonctions publiques.
Au cas où ceci pourrait vous aider, voici un exemple d'utilisation :
Code:
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
| if(Input.IsKeyDown(sf::Key::Z))
{
cam.Move(0.1,0,0);
}
if(Input.IsKeyDown(sf::Key::Q)&&Input.IsMouseButtonDown(sf::Mouse::Right))
{
cam.Move(0,-0.1,0);
}
if(Input.IsKeyDown(sf::Key::D)&&Input.IsMouseButtonDown(sf::Mouse::Right))
{
cam.Move(0,0.1,0);
}
if(Input.IsKeyDown(sf::Key::S))
{
cam.Move(-0.1,0,0);
}
if(Input.IsKeyDown(sf::Key::Q)&& !Input.IsMouseButtonDown(sf::Mouse::Right))
{
cam.RotateSide(1);
}
if(Input.IsKeyDown(sf::Key::D)&& !Input.IsMouseButtonDown(sf::Mouse::Right))
{
cam.RotateSide(-1);
}
if(Input.IsMouseButtonDown(sf::Mouse::Right)&&ok)
{
cam.RotateSide(-(static_cast<float>(Input.GetMouseX())-xac)/3);
cam.RotateTop((static_cast<float>(Input.GetMouseY())-yac)/3);
} |
Merci d'avance.