fPanoViewer.pas 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. unit fPanoViewer;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. Winapi.Windows,
  6. System.SysUtils,
  7. System.Classes,
  8. System.Math,
  9. Vcl.Graphics,
  10. Vcl.Controls,
  11. Vcl.Forms,
  12. Vcl.Dialogs,
  13. Vcl.ComCtrls,
  14. Vcl.StdCtrls,
  15. Vcl.ExtCtrls,
  16. Vcl.ExtDlgs,
  17. Vcl.Imaging.Jpeg,
  18. GLS.Scene,
  19. GLS.Objects,
  20. GLS.Texture,
  21. GLS.Keyboard,
  22. GLS.Cadencer,
  23. GLS.SceneViewer,
  24. GLS.Material,
  25. GLS.Coordinates,
  26. GLS.BaseClasses,
  27. GLS.Utils,
  28. GLS.VectorGeometry;
  29. type
  30. TForm1 = class(TForm)
  31. GLSceneViewer1: TGLSceneViewer;
  32. GLScene1: TGLScene;
  33. Panel1: TPanel;
  34. GLCamera1: TGLCamera;
  35. BtnLoad: TButton;
  36. TrackBar1: TTrackBar;
  37. LabelYaw: TLabel;
  38. LabelPitch: TLabel;
  39. OpenPictureDialog1: TOpenPictureDialog;
  40. Label1: TLabel;
  41. Sphere1: TGLSphere;
  42. GLMaterialLibrary1: TGLMaterialLibrary;
  43. Label2: TLabel;
  44. GLCadencer1: TGLCadencer;
  45. procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  46. Shift: TShiftState; X, Y: Integer);
  47. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  48. X, Y: Integer);
  49. procedure BtnLoadClick(Sender: TObject);
  50. procedure TrackBar1Change(Sender: TObject);
  51. procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
  52. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  53. procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  54. procedure GLCadencer1Progress(Sender: TObject;
  55. const deltaTime, newTime: Double);
  56. procedure FormCreate(Sender: TObject);
  57. private
  58. mx, my: Integer;
  59. pitch, yaw: single; // in degree
  60. procedure PanCameraAround(dx, dy: single);
  61. public
  62. end;
  63. var
  64. Form1: TForm1;
  65. implementation
  66. {$R *.DFM}
  67. procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  68. Shift: TShiftState; X, Y: Integer);
  69. begin
  70. mx := X;
  71. my := Y;
  72. end;
  73. procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  74. X, Y: Integer);
  75. var
  76. dx, dy, f: single;
  77. begin
  78. if Shift = [ssLeft] then
  79. begin
  80. f := 0.2 * 40 / GLCamera1.FocalLength;
  81. dx := (X - mx) * f;
  82. dy := (Y - my) * f;
  83. PanCameraAround(dx, dy);
  84. end;
  85. mx := X;
  86. my := Y;
  87. end;
  88. procedure TForm1.BtnLoadClick(Sender: TObject);
  89. begin
  90. with OpenPictureDialog1 do
  91. if Execute then
  92. GLMaterialLibrary1.Materials[0].Material.Texture.Image.LoadFromFile
  93. (FileName);
  94. end;
  95. procedure TForm1.TrackBar1Change(Sender: TObject);
  96. begin
  97. GLCamera1.FocalLength := TrackBar1.Position;
  98. end;
  99. procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  100. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  101. begin
  102. TrackBar1.Position := TrackBar1.Position + Round(2 * WheelDelta / 120);
  103. end;
  104. procedure TForm1.GLCadencer1Progress(Sender: TObject;
  105. const deltaTime, newTime: Double);
  106. const
  107. step_size = 20;
  108. var
  109. delta: single;
  110. dx, dy: single;
  111. begin
  112. delta := step_size * 40 / GLCamera1.FocalLength * deltaTime;
  113. dx := 0;
  114. dy := 0;
  115. if IsKeyDown(VK_LEFT) then
  116. dx := dx + delta;
  117. if IsKeyDown(VK_UP) then
  118. dy := dy + delta;
  119. if IsKeyDown(VK_RIGHT) then
  120. dx := dx - delta;
  121. if IsKeyDown(VK_DOWN) then
  122. dy := dy - delta;
  123. PanCameraAround(dx, dy);
  124. end;
  125. procedure TForm1.FormCreate(Sender: TObject);
  126. begin
  127. OpenPictureDialog1.InitialDir := ExtractFilePath(ParamStr(0));
  128. OpenPictureDialog1.FileName := 'sejourstmathieu2048.jpg';
  129. end;
  130. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  131. Shift: TShiftState);
  132. begin
  133. Key := 0; // all keys handled by Form1
  134. end;
  135. procedure TForm1.PanCameraAround(dx, dy: single);
  136. begin
  137. pitch := pitch + dy;
  138. yaw := yaw - dx;
  139. if pitch > 90 then
  140. pitch := 90;
  141. if pitch < -90 then
  142. pitch := -90;
  143. if yaw > 360 then
  144. yaw := yaw - 360;
  145. if yaw < 0 then
  146. yaw := yaw + 360;
  147. GLCamera1.Up.SetVector(0, 1, 0);
  148. GLCamera1.Direction.SetVector(sin(DegToRad(yaw)), sin(DegToRad(pitch)),
  149. -cos(DegToRad(yaw)));
  150. LabelPitch.caption := format('Pitch: %3f', [pitch]);
  151. LabelYaw.caption := format('Yaw: %3f', [yaw]);
  152. end;
  153. end.