Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
0.8.4:cameras [2022/07/20 14:13] – [TGorillaSmoothCameraController] admin0.8.4:cameras [2022/07/22 12:55] (current) – [Creating a Smooth Controller at Runtime] admin
Line 33: Line 33:
 ===== Target ===== ===== Target =====
  
-A very useful property of Firemonkey's TCamera component is the //Target// property. You can link the camera to another 3D object to always look at. This will compute view direction always towards the linked 3D object.+A very useful property of Firemonkey's TCamera component is the //Target// property. You can link the camera to another 3D object to always look at it. This will generate a view direction always towards the linked 3D object.
  
 You can use this property for easy camera navigation in 3D space. Combine a camera component with a non-visual TDummy instance to navigate. You can use this property for easy camera navigation in 3D space. Combine a camera component with a non-visual TDummy instance to navigate.
Line 134: Line 134:
 ===== Smooth Camera Controller ===== ===== Smooth Camera Controller =====
  
-Since version 0.8.4.2341 a TGorillaViewport component provides an embedded //TGorillaSmoothCameraController// component with automatic mouse feedback integration. This means: In case //UsingDesignCamera// is set to TRUE, the viewport will register OnMouseDown, OnMouseUp and OnMouseMove events and forward those events to the embedded TGorillaSmoothCameraController.+Since version 0.8.4.2341 a TGorillaViewport component provides an embedded //TGorillaSmoothCameraController// component with automatic mouse feedback integration. This means: In case //TGorillaViewport.UsingDesignCamera// is set to TRUE, the viewport will register OnMouseDown, OnMouseUp and OnMouseMove events and forward those events to the embedded TGorillaSmoothCameraController.
  
 This enables an easy-to-use mouse navigation for your 3D scene without any effort. This enables an easy-to-use mouse navigation for your 3D scene without any effort.
-The component provides many options to configure behaviour of the camera controller.+The smooth camera controller supports the following control: 
 +  * Rotation around Y-axis 
 +  * Rotation around X-axis (moving up / down) 
 +  * Zooming in / out 
 +  * Shifting / Translating on X-, Y- and Z-axis 
 + 
 +It is called "Smooth" because it moves smoothly and will not stop abruptly if user stops interacting. This provides a good user experience. 
 + 
 +Nevertheless you're able to control this smoothness and the controller itself by a variety of properties:
  
 ^Property ^ Description^ ^Property ^ Description^
Line 170: Line 178:
  
 ^Function^ ^Function^
-|function GetDesignCamera() : TCamera; virtual;| +|function GetDesignCamera() : TCamera;| 
-|function GetDesignCameraController() : TGorillaSmoothCameraController; virtual;|+|function GetDesignCameraController() : TGorillaSmoothCameraController;|
  
-===== Creating a Smooth Controller at Runtime =====+==== Creating a Smooth Controller at Runtime ====
  
 Besides the embedded camera controller in the viewport, you can of course create your own at runtime or designtime. Besides the embedded camera controller in the viewport, you can of course create your own at runtime or designtime.
  
 If you link the controller to a viewport component, it will automatically setup the necessary mouse events for you. If you link the controller to a viewport component, it will automatically setup the necessary mouse events for you.
-But you are also allow to control it yourself, f.e. by Gamepad or Keyboard events. For manual controlling please leave the viewport property empty.+But you are also allowed to control it yourself, f.e. by Gamepad or Keyboard events. For manual controlling please leave the viewport property empty
 + 
 + 
 +In the following code snippet we modify rotation manually in user-specific mouse events. 
 +We're also blocking shifting, because we only want to rotate the camera.
  
 <file pascal> <file pascal>
 uses uses
   Gorilla.Camera;   Gorilla.Camera;
 +
 +[...]
 +
 +type
 +  TForm1 = class(TForm)
 +    GorillaViewport1: TGorillaViewport;
 +    FCameraCtrl : TGorillaSmoothCameraController;
 +    FMyCamera : TGorillaCamera;
 +
 +  private
 +    FIsMoving : Boolean;
 +    FLastPoint : TPointF;
 +
 +    procedure DoOnViewportMouseUp(ASender : TObject; AButton : TMouseButton;
 +      AShift : TShiftState; X, Y : Single);
 +    procedure DoOnViewportMouseDown(ASender : TObject; AButton : TMouseButton;
 +      AShift : TShiftState; X, Y : Single);
 +    procedure DoOnViewportMouseMove(ASender : TObject; AShiftState : TShiftState;
 +      X, Y : Single);
 +  end;
      
-var FCameraCtrl : TGorillaSmoothCameraController; +  [...] 
-var FMyCamera TGorillaCamera;+   
 +procedure TForm1.FormCreate(Sender: TObject); 
 +begin 
 +  /// Deactivate design camera controller before registering user-specific events for mouse feedback 
 +  GorillaViewport1.UsingDesignCamera := FALSE; 
 +   
 +  /// Register user-specific mouse events to control our camera 
 +  GorillaViewport1.OnMouseUp   := DoOnViewportMouseUp; 
 +  GorillaViewport1.OnMouseDown := DoOnViewportMouseDown; 
 +  GorillaViewport1.OnMouseMove := DoOnViewportMouseMove; 
 +   
 +  /// Create a smooth camera controller 
 +  FCameraCtrl :TGorillaSmoothCameraController.Create(GorillaViewport1)
 +  FCameraCtrl.Parent := GorillaViewport; 
 +   
 +  /// NOTICE: Enable only rotation. Disable zooming and shifting 
 +  FCameraCtrl.Types := [TGorillaSmoothCameraControlType.scctRotateY, TGorillaSmoothCameraControlType.scctMoveY];
  
-FCameraCtrl := TGorillaSmoothCameraController.Create(GorillaViewport1); +  /// Create our own camera for this controller 
-FCameraCtrl.Parent := GorillaViewport; +  FMyCamera := TGorillaCamera.Create(FCameraCtrl); 
-FCameraCtrl.Types := [];+  FMyCamera.Parent := FCameraCtrl;
  
-FMyCamera := TGorillaCamera.Create(FCameraCtrl)+  /// Link the camera to the controller 
-FMyCamera.Parent := FCameraCtrl;+  FCameraCtrl.Camera := FMyCamera
 +   
 +  /// Activate the camera for rendering 
 +  GorillaViewport1.Camera := FMyCamera; 
 +   
 +  [...] 
 +end;
  
-FCameraCtrl.Camera := FMyCamera;+procedure TForm1.DoOnViewportMouseUp(ASender : TObject; AButton : TMouseButton; 
 +  AShift : TShiftState; X, Y : Single); 
 +begin 
 +  FIsMoving := false; 
 +end; 
 + 
 +procedure TForm1.DoOnViewportMouseDown(ASender : TObject; AButton : TMouseButton; 
 +  AShift : TShiftState; X, Y : Single); 
 +begin 
 +  FIsMoving  := true; 
 +  FLastPoint := PointF(X, Y); 
 +end; 
 + 
 +procedure TForm1.DoOnViewportMouseMove(ASender : TObject; AShiftState : TShiftState; 
 +  X, Y : Single); 
 +var LDiff : TPointF; 
 +begin 
 +  if FIsMoving then 
 +  begin 
 +    if (ssLeft in AShiftState) then 
 +    begin 
 +      LDiff := PointF(X, Y) - FLastPoint; 
 +       
 +      /// Rotate around y-axis + Move up and down 
 +      FCameraCtrl.AddImpulse(LDiff); 
 +    end; 
 + 
 +    /// finally store the last mouse position 
 +    FLastPoint := PointF(X, Y); 
 +  end; 
 +end;
 </file> </file>
  
 +The smooth camera controller provides a number of helpful functions to modify it from external.
 +
 +^Function^Description^
 +|procedure AddImpulse(AOfs : TPointF);|Call this procedure to rotate around Y axis (AOfs.X) and move the camera up or down (AOfs.Y).|
 +|procedure AddXImpulse(AAngle : Single);|Call this procedure to rotate around Y axis.|
 +|procedure AddYImpulse(AAngle : Single); |Call this procedure to move camera up and down.|
 +|procedure Zoom(AStrength : Single = 1);|Call this procedure if you want to zoom in or out. The strength parameter defines the intensity of zooming.|
 +|procedure Shift(AOfs : TPoint3D);|Move the camera controller on X, Y and Z axis.|
 +
 +
 +You can manipulate impulse values for rotation, zooming and shifting directly by the following properties.
 +
 +^Property^Description^
 +|Impulse.X|Get or set the current impulse for rotation around Y-axis (X value).|
 +|Impulse.Y|Get or set the current impulse for moving up and down (Y value)|
 +|Impulse.Z|Get or set the current impulse for zooming in/out (Z value)|
 +|ShiftImpulse.X|Get or set the current impulse for shifting on X axis.|
 +|ShiftImpulse.Y|Get or set the current impulse for shifting on Y axis.|
 +|ShiftImpulse.Z|Get or set the current impulse for shifting on Z axis.|
 +
 +Next step: [[lights|Lights]]