4

飛行機との衝突点を見つけるという最終的な目標を持って、マウス クリックでレイ キャスティングを実行しようとしています。ただし、レイを作成できません。世界は、フラスタムとカメラとして使用している別のマトリックスを使用して、フラスタム * カメラ * vertex_position の順序でレンダリングされます。画面の左上を 0,0 にすると、クリックの X,Y をピクセル単位で取得できます。次に、以下のコードを使用してこれを光線に変換します。

  float x = (2.0f * x_screen_position) / width - 1.0f;
  float y = 1.0f - (2.0f * y_screen_position) / height;
  Vector4 screen_click = Vector4 (x, y, 1.0f, 1.0f);
  Vector4 ray_origin_world = get_camera_matrix() * screen_click;

  Vector4 tmp = (inverse(get_view_frustum()) * screen_click;
  tmp = get_camera_matrix() * tmp;
  Vector4 ray_direction = normalize(tmp);

view_frustum マトリックス:

Matrix4 view_frustum(float angle_of_view, float aspect_ratio, float z_near, float z_far) {
    return Matrix4(
        Vector4(1.0/tan(angle_of_view), 0.0, 0.0, 0.0),
        Vector4(0.0, aspect_ratio/tan(angle_of_view), 0.0, 0.0),
        Vector4(0.0, 0.0, (z_far+z_near)/(z_far-z_near), 1.0),
        Vector4(0.0, 0.0, -2.0*z_far*z_near/(z_far-z_near), 0.0)
    );
}

「カメラ」マトリックスが 0,0,0 の場合、期待どおりの結果が得られますが、別の場所の固定カメラ位置に変更すると、返される結果はまったく正しくありません。固定された「カメラ」マトリックス:

Matrix4(
    Vector4(1.0, 0.0, 0.0, 0.0),
    Vector4(0.0, 0.70710678118, -0.70710678118, 0.000),
    Vector4(0.0, 0.70710678118, 0.70710678118, 0.0),
    Vector4(0.0, 8.0, 20.0, 1.000)
  );

私がオンラインで見つけた多くの例は、そのような方法でカメラを実装していないため、この場合に役立つ多くの情報を見つけることができません. 誰かがこれについての洞察を提供したり、より良い方向に向けたりすることはできますか?

4

1 に答える 1