Stride

OPEN / CLOSE
  • Features
  • Blog
  • Documentation
  • Community
(icon) Download

  • Discord
  • Facebook
  • Twitter
  • YouTube

LANGUAGE

OPEN / CLOSE
  • English
  • 日本語
    Show / Hide Table of Contents

    Raycasting

    Intermediate Programmer

    Raycasting traces an invisible line through the scene to find intersecting colliders. This is useful, for example, to check which objects are in a gun's line of fire, or are under the mouse cursor when the user clicks.

    Note

    Raycasting uses colliders to calculate intersections. It ignores entities that have no collider component. For more information, see Colliders.

    To use a raycast, in the current Simulation, use Simulation.Raycast.

    For an example of raycasting, see the Physics Sample project included with Stride.

    Example code

    This code sends a raycast from the mouse's screen position:

    public static bool ScreenPositionToWorldPositionRaycast(Vector2 screenPos, CameraComponent camera, Simulation simulation)
    {
        Matrix invViewProj = Matrix.Invert(camera.ViewProjectionMatrix);
    
        // Reconstruct the projection-space position in the (-1, +1) range.
        //    Don't forget that Y is down in screen coordinates, but up in projection space
        Vector3 sPos;
        sPos.X = screenPos.X * 2f - 1f;
        sPos.Y = 1f - screenPos.Y * 2f;
    
        // Compute the near (start) point for the raycast
        // It's assumed to have the same projection space (x,y) coordinates and z = 0 (lying on the near plane)
        // We need to unproject it to world space
        sPos.Z = 0f;
        var vectorNear = Vector3.Transform(sPos, invViewProj);
        vectorNear /= vectorNear.W;
    
        // Compute the far (end) point for the raycast
        // It's assumed to have the same projection space (x,y) coordinates and z = 1 (lying on the far plane)
        // We need to unproject it to world space
        sPos.Z = 1f;
        var vectorFar = Vector3.Transform(sPos, invViewProj);
        vectorFar /= vectorFar.W;
    
        // Raycast from the point on the near plane to the point on the far plane and get the collision result
        var result = simulation.Raycast(vectorNear.XYZ(), vectorFar.XYZ());
        return result.Succeeded;
    }
    

    See also

    • Colliders
    • Improve this Doc
    In This Article

    Back to top

    Copyright © 2019-2021 .NET Foundation and Contributors
    Supported by the .NET Foundation