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
1.1.0:picking [2024/04/09 15:45] admin1.1.0:picking [2024/04/09 15:59] (current) admin
Line 23: Line 23:
     Hit          : Boolean;     Hit          : Boolean;
     Intersection : TPoint3D;     Intersection : TPoint3D;
-    Instance     : TObject;+    Instance     : TObject; // TCustomMeshDef/TMeshDef/TGorillaMesh
     Triangle     : Array[0..2] of TPoint3D;     Triangle     : Array[0..2] of TPoint3D;
   end;   end;
 </file> </file>
 +
 +As example, you can register an OnMouseUp event on your specific mesh/model or sub-mesh.
 +Within your OnMouseUp event you can then perform the raycasting or triangle picking:
 +
 +<file Pascal>
 +procedure TForm1.MyMeshMouseUp(Sender: TObject; Button: TMouseButton;
 +  Shift: TShiftState; X, Y: Single; RayPos, RayDir: TVector3D);
 +var LAbsRayPos, LAbsRayDir : TVector3D;
 +    LIntersect, LNormal : TPoint3D;
 +    LMesh : TGorillaMesh;
 +    LTriResult  : TTriangleRayCastResult;
 +begin
 +  LMesh := Sender as TGorillaMesh;
 +
 +  if not Assigned(LMesh) then
 +    Exit;
 +
 +  // Convert from local vector to absolute, because we're currently in object space
 +  LAbsRayPos := LMesh.LocalToAbsoluteVector(ARayPos);
 +  LAbsRayDir := LMesh.LocalToAbsoluteDirection(ARayDir);
 +
 +  // Perform a raycast intersection test and if it hits the mesh, show a message 
 +  if LMesh.RayCastIntersect(LAbsRayPos, LAbsRayDir, LIntersect, LNormal) then
 +    ShowMessage(Format('Intersection-Point = (%n, %n, %n)', [LIntersect.X, LIntersect.Y, LIntersect.Z]));
 +    
 +  // Or perform a triangle pick and output the triangle points and the instance pointer too
 +  if LMesh.PickTriangle(LAbsRayPos, LAbsRayDir, LTriResult) then
 +    ShowMessage(Format('instance=%d, Intersection-Point = (%n, %n, %n), triangle-P1=(%n,%n,%n), triangle-P2=(%n,%n,%n), triangle-P3=(%n,%n,%n)', 
 +      [
 +      NativeUInt(LTriResult.Instance),
 +      LTriResult.Intersection.X, LTriResult.Intersection.Y, LTriResult.Intersection.Z,
 +      
 +      LTriResult.Triangle[0].X, LTriResult.Triangle[0].Y, LTriResult.Triangle[0].Z,
 +      LTriResult.Triangle[1].X, LTriResult.Triangle[1].Y, LTriResult.Triangle[1].Z,
 +      LTriResult.Triangle[2].X, LTriResult.Triangle[2].Y, LTriResult.Triangle[2].Z
 +      ]));
 +end;
 +</file>
 +
 +Next step: [[charactercontrolling|CharacterControlling]]