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
Last revisionBoth sides next revision
1.1.0:picking [2024/04/09 15:46] admin1.1.0:picking [2024/04/09 15:58] admin
Line 26: Line 26:
     Triangle     : Array[0..2] of TPoint3D;     Triangle     : Array[0..2] of TPoint3D;
   end;   end;
 +</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> </file>