Bonjour
J'utilise GLScene sous Delphi 7 et je commence à peine à m'amuser avec
Dans mon petit projet, je souhaite sauvegarder la position et l'orientation de la caméra à l'aide d'un raccourci clavier SHIFT+F1 par exemple et la revenir à cette même position avec CTRL+F1 par exemple. Un peu comme des signets mais pour les vues caméra.
J'ai presque réussi, la position est bien reprise mais pour ce qui est de l'orientation, c'est pas encore ça.
J'ai en tout 5 signets pour gérer mes vues.
J'ai crée un type TCameraView et un autre TViews qui regroupe les 5 signets de vues possibles :
Pour ce qui est de sauvegarder la position de la caméra, je procède comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 type TCameraView = RECORD assigned : boolean; x,y,z : single; // position dX, dY, dZ : single; // direction uX, uY, uZ : single; // Up tA, rA, pA : single; // angles Turn, Roll, Pitch END; TViews = array[1..5] of TCameraView;
Pour ce qui est de restaurer la vue avec position, orientation etc... j'utilise cette procédure :
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 procedure TForm1.SaveView(n: integer); begin with Views[n] do begin assigned:=true; X:= GLSceneViewer1.Camera.Position.X; Y:= GLSceneViewer1.Camera.Position.Y; Z:= GLSceneViewer1.Camera.Position.Z; dX:= GLSceneViewer1.Camera.Direction.X; dY:= GLSceneViewer1.Camera.Direction.Y; dZ:= GLSceneViewer1.Camera.Direction.Z; uX:= GLSceneViewer1.Camera.Up.X; uY:= GLSceneViewer1.Camera.Up.Y; uZ:= GLSceneViewer1.Camera.Up.Z; pA:= GLSceneViewer1.Camera.PitchAngle; rA:= GLSceneViewer1.Camera.RollAngle; tA:= GLSceneViewer1.Camera.TurnAngle; end; end;
Hélas, il faut que j'utilise plusieurs fois de suite (au moins 4 ou 5 fois) l'appel à ShowView(n) pour que la vue se rétablisse correctement.
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 procedure TForm1.ShowView(n : integer); begin with Views[n] do if Assigned then begin GLSceneViewer1.Camera.Position.X := X; GLSceneViewer1.Camera.Position.Y := Y; GLSceneViewer1.Camera.Position.Z := Z; GLSceneViewer1.Camera.Direction.X := dX; GLSceneViewer1.Camera.Direction.Y := dY; GLSceneViewer1.Camera.Direction.Z := dZ; GLSceneViewer1.Camera.Up.X := uX; GLSceneViewer1.Camera.Up.Y := uY; GLSceneViewer1.Camera.Up.Z := uZ; end; end;
Existe-t-il n moyen de faire ça sans appeller 5 ou 6 fois de suite cette même procédure car lorsqu'on modifie Direction.X, .Y ou .Z on modifie du coup, les autres valeurs changent aussi ; même chose pour Up.
Quelqu'un a t-il une idée ? ça serait cool de faire une F.A.Q sur GLScene
Merci pour vos idées
Partager