Table of Contents

レイキャスティング

中級 プログラマー

レイキャスティングは、シーン内を通る見えない直線をトレースして、交差しているコライダーを検出します。これは、たとえば、銃の射線内にあるオブジェクトや、ユーザーがクリックしたときにマウス カーソルの下にあるオブジェクトを調べるのに役立ちます。

Note

レイキャスティングはコライダーを使用して交差を計算します。コライダー コンポーネントを持たないエンティティは無視されます。詳細については、「コライダー」を参照してください。

レイキャストを使用するには、現在の Simulation で、Simulation.Raycast を使用します。

レイキャスティングのレイについては、Stride に含まれる Physics Sample プロジェクトを参照してください。

コード例

次のコードは、マウスの画面位置からレイキャストを送ります。

public static bool ScreenPositionToWorldPositionRaycast(Vector2 screenPos, CameraComponent camera, Simulation simulation)
{
    Matrix invViewProj = Matrix.Invert(camera.ViewProjectionMatrix);

    // (-1, +1) の範囲に投影空間の位置を再構築する。
    //    Y は画面座標では下だが、投影空間では上であることを忘れないこと
    Vector3 sPos;
    sPos.X = screenPos.X * 2f - 1f;
    sPos.Y = 1f - screenPos.Y * 2f;

    // レイキャストの近い側の (開始) ポイントを計算する
    // 同じ投影空間 (x,y) 座標と z = 0 を持つものと想定する (近い平面上にある)
    // ワールド空間には投影しないようにする必要がある
    sPos.Z = 0f;
    var vectorNear = Vector3.Transform(sPos, invViewProj);
    vectorNear /= vectorNear.W;

    // レイキャストの遠い側の (終了) ポイントを計算する
    // 同じ投影空間 (x,y) 座標と z = 1 を持つものと想定する (遠い平面上にある)
    // ワールド空間には投影しないようにする必要がある
    sPos.Z = 1f;
    var vectorFar = Vector3.Transform(sPos, invViewProj);
    vectorFar /= vectorFar.W;

    // 近い平面のポイントから遠い平面のポイントにレイキャストし、衝突の結果を取得する
    var result = simulation.Raycast(vectorNear.XYZ(), vectorFar.XYZ());
    return result.Succeeded;
}

関連項目