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] – [Creating a Smooth Controller at Runtime] 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 ====
Line 178: Line 186:
  
 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]]