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:22] – [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.
- +
-The smooth camera controller provides a number of helpful functions to modify it from external. +
- +
-^Function^Description^ +
-|||+
  
  
 In the following code snippet we modify rotation manually in user-specific mouse events. 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>
Line 216: Line 220:
 procedure TForm1.FormCreate(Sender: TObject); procedure TForm1.FormCreate(Sender: TObject);
 begin 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.OnMouseUp   := DoOnViewportMouseUp;
   GorillaViewport1.OnMouseDown := DoOnViewportMouseDown;   GorillaViewport1.OnMouseDown := DoOnViewportMouseDown;
   GorillaViewport1.OnMouseMove := DoOnViewportMouseMove;   GorillaViewport1.OnMouseMove := DoOnViewportMouseMove;
      
 +  /// Create a smooth camera controller
   FCameraCtrl := TGorillaSmoothCameraController.Create(GorillaViewport1);   FCameraCtrl := TGorillaSmoothCameraController.Create(GorillaViewport1);
   FCameraCtrl.Parent := GorillaViewport;   FCameraCtrl.Parent := GorillaViewport;
-  FCameraCtrl.Types := [];+   
 +  /// NOTICE: Enable only rotation. Disable zooming and shifting 
 +  FCameraCtrl.Types := [TGorillaSmoothCameraControlType.scctRotateY, TGorillaSmoothCameraControlType.scctMoveY];
  
 +  /// Create our own camera for this controller
   FMyCamera := TGorillaCamera.Create(FCameraCtrl);   FMyCamera := TGorillaCamera.Create(FCameraCtrl);
   FMyCamera.Parent := FCameraCtrl;   FMyCamera.Parent := FCameraCtrl;
  
 +  /// Link the camera to the controller
   FCameraCtrl.Camera := FMyCamera;   FCameraCtrl.Camera := FMyCamera;
 +  
 +  /// Activate the camera for rendering
 +  GorillaViewport1.Camera := FMyCamera;
      
   [...]   [...]
Line 264: Line 280:
 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]]