Bonjour,
Je tente actuellement de m'emparer petit à petit des notions englobant la création d'une caméra, et je suis confronté à une différence de rendu entre mon implémentation de caméra, et celle rendu par l'appel de la fonction gluLookAt.
Et je n'arrive pas à comprendre pourquoi.
En fait, pour être précis, on dirait que dans mon rendu, la distance de la caméra par rapport à la scène est doublée. *
Pourtant, il me semble bien d'après les différents articles, documentations, et consorts que j'ai pu lire à ce sujet faire la même chose que ce que glulookat fait.
Voici ce que je fais :
Lorsque je veux tester pour gluLookAt, je dé commente la l.20 et je commente les deux lignes du dessus, et vice versa.
Code : 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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 Camera::Camera() { glMatrixMode(GL_PROJECTION); gluPerspective(90.f, 4.f/3.f, 0.1f, 100.f); glMatrixMode(GL_MODELVIEW); eye_.set(1.f,0.f,1.f); target_.set(0.f,0.f,0.f); up_.set(0.f,1.f,0.f); lookAt(); } void Camera::update(int elapsedTime) const { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMultMatrixf(&viewMatrix_[0][0]); glTranslatef(-eye_.x, -eye_.y, -eye_.z); //gluLookAt(1,0,1,0,0,0,0,1,0); } void Camera::lookAt() { const static int x = 0, y = 1, z = 2, w = 3; Vector3 left, forward, zAxis; forward = target_ - eye_; forward.normalize(); zAxis = -forward; zAxis.normalize(); //Left left = Vector3::cross(forward, up_); left.normalize(); up_ = Vector3::cross(left, forward); up_.normalize(); viewMatrix_.identity(); viewMatrix_[x][x] = left.x; viewMatrix_[y][x] = left.y; viewMatrix_[z][x] = left.z; viewMatrix_[w][x] = -Vector3::dot(eye_, left); viewMatrix_[x][y] = up_.x; viewMatrix_[y][y] = up_.y; viewMatrix_[z][y] = up_.z; viewMatrix_[w][y] = -Vector3::dot(eye_, up_); viewMatrix_[x][z] = zAxis.x; viewMatrix_[y][z] = zAxis.y; viewMatrix_[z][z] = zAxis.z; viewMatrix_[w][z] = -Vector3::dot(eye_, zAxis); viewMatrix_[x][w] = 0.f; viewMatrix_[y][w] = 0.f; viewMatrix_[z][w] = 0.f; viewMatrix_[w][w] = 1.f; }
La méthode update est appelée avant chaque rendu, la méthode lookAt n'est - pour le moment - appelée qu'à la construction de l'objet Camera.
Les objets mathématiques utilisés (Vector3, Matrix4, etc.) proviennent tous de la librarie de DHPoware, trouvable ici.
Du coup, je ne comprends pas bien ce que je fais de mal. La matrice de projection/perspective doit elle intervenir dans le calcul ? Un problème d'initialisation ?
Je suis pas mal bloqué face à cette différence, du coup, si quelqu'un pouvait m'aiguiller, je lui serai grandement reconnaissant(e).
* Cf: Pièce-jointe.
Partager