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
Next revisionBoth sides next revision
interaction [2020/05/26 12:41] – [Interaction] admininteraction [2020/05/26 12:53] – [Gesture Interaction] admin
Line 210: Line 210:
 ===== Gesture Interaction ===== ===== Gesture Interaction =====
  
 +Gesture handling is supported for Gorilla3D viewport. To allow gesture management you will need a TGestureManager component on your form and you have to link it to the TGorillaViewport component.
 +
 +In the example below it is described, how to rotate and zoom a model. Therefor we use the interactive gestures: ZOOM and PAN.
 +In the //OnGesture// event of our GorillaViewport1 we setup a callback procedure to handle gesture input. Simple check for the supplied interactive gesture event: //igiZoom// or //igiPan// and execute the very simple //DoZoom// and //DoRotate// sub-routines.
 +
 +<file pascal>
 +type
 +  TForm1 = class(TForm)
 +    GorillaViewport1: TGorillaViewport;
 +    GestureManager1: TGestureManager;
 +    GorillaModel1: TGorillaModel;
 +    
 +    procedure GorillaViewport1Gesture(Sender: TObject;
 +      const EventInfo: TGestureEventInfo; var Handled: Boolean);
 +      
 +    protected
 +      FLastPos : TPointF;
 +      
 +    [...]
 +  end;
 +  
 +procedure TForm1.FormCreate(Sender : TObject);
 +begin
 +  GorillaViewport1.Touch.GestureManager := GestureManager1;
 +  GorillaViewport1.Touch.InteractiveGestures := [Zoom, Pan];
 +  GorillaViewport1.OnGesture := GorillaViewport1Gesture;
 +  [...]
 +end;
 +
 +procedure TForm1.GorillaViewport1Gesture(Sender: TObject;
 +  const EventInfo: TGestureEventInfo; var Handled: Boolean);
 +
 +  procedure DoZoom();
 +  var LScale : Single;
 +  begin
 +    if not (TInteractiveGestureFlag.gfBegin in EventInfo.Flags)
 +    and not (TInteractiveGestureFlag.gfEnd in EventInfo.Flags) then
 +    begin
 +      LScale := EventInfo.Distance / 100;
 +      GorillaModel1.Scale.Point := Point3D(LScale, LScale, LScale);
 +    end;
 +  end;
 +
 +  procedure DoRotate();
 +  var LDist : Single;
 +      LDiff,
 +      LNew,
 +      LPos  : TPointF;
 +  begin
 +    LNew := EventInfo.Location;
 +
 +    if not Assigned(GorillaModel1) then
 +    begin
 +      FLastPos := LNew;
 +      Exit;
 +    end;
 +
 +    if not (TInteractiveGestureFlag.gfBegin in EventInfo.Flags)
 +    and not (TInteractiveGestureFlag.gfEnd in EventInfo.Flags) then
 +    begin
 +      LPos := EventInfo.Location;
 +      LDiff := FLastPos - LPos;
 +
 +      LDist := LDiff.X / 5;
 +
 +      GorillaModel1.RotationAngle.Y := GorillaModel1.RotationAngle.Y + LDist;
 +    end;
 +
 +    FLastPos := LNew;
 +  end;
 +
 +begin
 +  // just a dirty and quick solution for gesture handling
 +  case EventInfo.GestureID of
 +    igiZoom :
 +      begin
 +        // zoom
 +        DoZoom();
 +        Handled := true;
 +      end;
 +
 +    igiPan :
 +      begin
 +        // rotate model
 +        DoRotate();
 +        Handled := true;
 +      end;
 +
 +    else
 +      begin
 +        Handled := false;
 +      end;
 +  end;
 +end;
 +</file>
 ===== GamePad Interaction ===== ===== GamePad Interaction =====