5

OpenGL でマウス ピッキングを実行するために光線と球体の交差を使用しようとしています。オンラインでいくつかの数式を見つけました。最後に試したのは、Stack Exchange のユーザーによって提案されたものでした。

光線と球体の交差

この回答について私が理解したことから、二次方程式に正の根があるかどうかを確認しています。光線が球とまったく交差する場合でも、交差がどこで発生するかはあまり気にしません。私のコードは次のとおりですが、動作していないようです。

bool Mesh::useObject(vec3 camera, vec3 direction) {

    // a = (xB-xA)²+(yB-yA)²+(zB-zA)²
    float a = ((direction.v[0] - camera.v[0])*(direction.v[0] - camera.v[0])
        + (direction.v[1] - camera.v[1])*(direction.v[1] - camera.v[1])
        + (direction.v[2] - camera.v[2])*(direction.v[2] - camera.v[2]));

    // b = 2*((xB-xA)(xA-xC)+(yB-yA)(yA-yC)+(zB-zA)(zA-zC))
    float b = 2 * ((direction.v[0] - camera.v[0])*(camera.v[0] - mOrigin.v[0])
        + (direction.v[1] - camera.v[1])*(camera.v[1] - mOrigin.v[1])
        + (direction.v[2] - camera.v[2])*(camera.v[2] - mOrigin.v[2]));

    // c = (xA-xC)²+(yA-yC)²+(zA-zC)²-r²
    float c = ((camera.v[0] - mOrigin.v[0])*(camera.v[0] - mOrigin.v[0])
        + (camera.v[1] - mOrigin.v[1])*(camera.v[1] - mOrigin.v[1])
        + (camera.v[2] - mOrigin.v[2])*(camera.v[2] - mOrigin.v[2])
        - (mRadius)*(mRadius));

    float delta = (b*b) - (4 * a*c);

    if (delta < 0)
        return false;

    else {
        std::cout << "Object " << mMesh << " is at postion (" <<
            mOrigin.v[0] << ", " <<
            mOrigin.v[1] << ", " <<
            mOrigin.v[2] << ")\n" <<
            "Size: " << mRadius << std::endl;
        return true;
    }
}

私の C++ スキルはかなり未熟なので、これが恐ろしい方法である場合は申し訳ありません。このメソッドは、3 つのフロートの 2 つのベクトル、カメラの位置、およびカメラの 1 ユニット前のシーン内のポイントの座標を取得します (この方向を呼び出しました)。

オブジェクトに直面してキーを押したときにオブジェクトの位置と半径を取得したいのですが、代わりに、シーン内のオブジェクトの 1 つに立っているとき、または別の大きなオブジェクトの近くに立っているときにのみ出力を取得します物体。明らかに私の計算 (またはさらに悪いことに、私のコード) に何か問題がありますが、それが何であるかを理解することはできません。:(

さらにコードが必要な場合、または不明な点がある場合はお知らせください。これは SO での最初の質問なので、この質問の言い回しが悪い場合は申し訳ありません。

編集:マウス座標をレイ上のポイントとして使用するべきではありませんでした。私の質問を少し編集しました。

4

1 に答える 1