Bonjour
Le logiciel sur lequel je travaille affiche des modèles 3D. Je veux gérer la caméra comme dans un logiciel de CAO.
C'est à dire:
- la translation est en repère caméra (les objets bougent dans un plan // à l'écran)
- la rotation se fait autour d'un point, qui bouge avec la caméra (le centre de l'écran, à une distance fixe)
J'arrive à obtenir une condition, ou l'autre mais jamais les deux en même temps.
Soit je translate correctement, mais la rotation est autour du point (0, 0, 0) du modèle (avec le code ci-dessous)
Soit la rotation est correcte, mais je translate en repère objet, et non caméra (en inversant la translation et la rotation ci-dessous)
Voici un code simplifié (je suis en VB.NET avec OpenTK)
Code vb : 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 Private Sub Render() GL.LoadIdentity() GL.MultMatrix(lookAtMat_) GL.MultMatrix(transMat_) GL.MultMatrix(rotMat_) DrawModel() End Sub Private Sub ResetView() camPos_.X = eyeX camPos_.Y = avgY camPos_.Z = avgZ centerPos_.X = avgX centerPos_.Y = avgY centerPos_.Z = avgZ upVec_.X = 0 upVec_.Y = 0 upVec_.Z = 1 lookAtMat_ = Matrix4.LookAt(camPos_, centerPos_, upVec_) transMat_ = Matrix4.Identity rotMat_ = Matrix4.Identity End Sub Private Sub MouseMove(...) deltaX = ... deltaY = ... Dim m As Matrix4 if move then Matrix4.CreateTranslation(0, deltaX / 2, -deltaY / 2, m) transMat_ = transMat_ * m else Dim m1 As Matrix4 = Matrix4.CreateRotationZ(0.005 * deltaX) Dim m2 As Matrix4 = Matrix4.CreateRotationY(0.005 * deltaY) m = m1 * m2 rotMat_ = rotMat_ * m end if End Sub
Je comprends pourquoi j'obtiens ces resultats, mais je ne sais pas comment arriver à ce que je souhaite.
Merci d'avance !
Partager