1

2Dポイント(x、y)があり、それをベクターに投影したいので、レイトレーシングを実行して、ユーザーが3Dオブジェクトをクリックしたかどうかを確認できます。他のすべてのコードは、次の場合を除いて記述しています。私は自分の関数に戻って、マウスのxyコードからベクトルを取得しました。視野を考慮していませんでした。「ブードゥー」の修正はそうではないため、要因が何であるかを推測したくありません。ライブラリの良いアイデア。数学の魔術師は助けたいですか?:-)。

これが私の現在のコードで、カメラのFOVを適用する必要があります。

sf::Vector3<float> Camera::Get3DVector(int Posx, int Posy, sf::Vector2<int> ScreenSize){
    //not using a "wide lens", and will maintain the aspect ratio of the viewport
    int window_x = Posx - ScreenSize.x/2;
    int window_y = (ScreenSize.y - Posy) - ScreenSize.y/2;
    float Ray_x = float(window_x)/float(ScreenSize.x/2);
    float Ray_y = float(window_y)/float(ScreenSize.y/2);

    sf::Vector3<float> Vector(Ray_x,Ray_y, -_zNear);
    // to global cords
    return MultiplyByMatrix((Vector/LengthOfVector(Vector)), _XMatrix, _YMatrix, _ZMatrix);
}
4

1 に答える 1

1

おならはそれほど遠くありません。1つは、マウスが-1から1のスペース(0から1ではない)にあることを確認することです。次に、2つのベクトルを作成します。

Vector3 orig = Vector3(mouse.X,mouse.Y,0.0f);
Vector3 far = Vector3(mouse.X,mouse.Y,1.0f);

また、パースペクティブ変換の逆を使用する必要があります(またはワールドスペースが必要な場合はviewprojection)

Matrix ivp = Matrix::Invert(Projection)

次に、次のことを行います。

Vector3 rayorigin = Vector3::TransformCoordinate(orig,ivp);
Vector3 rayfar = Vector3::TransformCoordinate(far,ivp);

光線が必要な場合は、方向も必要です。これは単純に次のとおりです。

Vector3 raydir = Normalize(rayfar-rayorigin);
于 2013-01-19T18:29:54.487 に答える