Bonjour,

Je fais face à un problème dans la réalisation de mon programme de RayTracing. J'aimerai avoir une caméra qui peut bouger dans l'espace et tourner grâce à des raccourcis et tout ceci en temps réel.
J'ai quelques difficultés pour réalisé cela, par rapport aux mathématiques qu'il faut appliquer.

Alors, comment ma caméra est définie :

Code c : Sélectionner tout - Visualiser dans une fenêtre à part
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
t_cam   *CameraInit(t_vec vCamPos, t_vec vUpVector)
{
  t_cam *cam;
 
  if ((cam = bunny_malloc(sizeof(*cam))) == NULL)
    {
      print_error("Error: bunny_malloc error\n");
      return NULL;
    }
  cam->camPos = vCamPos;
  cam->upVec = vUpVector;
  cam->viewPlanDist = 0.5f;
  cam->viewPlanHeight = 0.35f;
  cam->viewPlanWidth = 0.5f;
  return cam;
}
 
t_cam   *Camera(t_vec camPos, t_vec lookAtPoint, t_vec upVector, char *name)
{
  t_vec tmp;
  t_vec tmp2;
  t_cam *cam;
 
  if ((cam = CameraInit(camPos, upVector)) == NULL)
    return NULL;
  cam->name = name;
  cam->lookAtPoint = lookAtPoint;
  cam->vecDir = VecSoustraction(lookAtPoint, camPos);
  Normalize(&cam->vecDir);
  printf("VecDir = x: %f y: %f z: %f\n", cam->vecDir.x, cam->vecDir.y, cam->vecDir.z);
  cam->rightVec = VecMultiply(cam->upVec, cam->vecDir);
  cam->upVec = VecMultiply(cam->vecDir, cam->rightVec);
  tmp = VecScalingMult(cam->vecDir, cam->viewPlanDist);
  tmp2 = VecScalingMult(cam->upVec, cam->viewPlanHeight / 2.0f);
  tmp = VecAddition(tmp, tmp2);
  tmp = VecAddition(tmp, cam->camPos);
  tmp2 = VecScalingMult(cam->rightVec, cam->viewPlanWidth / 2.0f);
  cam->viewPlanUpLeft = VecSoustraction(tmp, tmp2);
  return cam;
}

Les noms des variables et fonctions sont assez explicites mais si jamais vous avez une question n'hésitez pas. La fonction VecScalingMult multiplie simplement chaque composante du vecteur par un coefficient.
Donc pour ma caméra j'ai le vecteur directeur normalisé, le UpVector, le RightVector, la position du point qu'elle regarde et sa position dans l'espace.

Quelqu'un aurait-il une idée de comment réaliser cela ?

Pour la translation, j'ai simplement essayé d'incrémenter/décrémenter les valeurs des coordonnées de la position de la caméra suivant le déplacement qu'on effectue. Mais, si la caméra change d'orientation (on regarde derrière par exemple) et bien lorsque j'appuie sur ma touche pour avancer (on incrémente la position en z qui représente la profondeur) on ira donc en arrière au lieu d'aller en avant. De ce fait, l'orientation de la caméra doit compter dans la translation. Mais je n'ai aucune idée de comment le prendre en compte :/

Merci par avance.