1

レイがオブジェクトに「十分に近づく」場合、基本的に私に通知する関数を実装するのに苦労しています

基本的に、レイを作成するためにレイピッキング @nornagonsolutionの実装を実装しました。画面上のオブジェクトはポイントを中心にしています。光線がこの点から一定の距離内にある場合、オブジェクトが選択されていると思います。

私はそれらの3つのポイント(X、Y、Z)を呼び出します:_pickFrom、_pickToおよびpO

まず、これは画面上のマウスの位置に応じてレイを計算する私の方法です。

    public static void Pick(int x, int y)
    {
        float nx = 2.0f * ((float)x) / ((float)_width) - 1.0f;

        float ny = 1.0f - 2.0f * ((float)y) / ((float)_height);

        Matrix4 unview = Matrix4.Invert(Matrix4.Mult(_projectionMatrix, _modelviewMatrix));

        Vector4 nearPoint = Vector4.Transform(new Vector4(nx, ny, 0, 1), unview);

        _pickTo = nearPoint - _pickFrom;
    }

_pickFromは、シーン内のカメラの位置です。_pickToは、ピックレイの方向です。_widthと_heightはrendercontextのサイズです。

ピックレイまでのポイントの距離を与える関数をどのように実装しますか?

4

1 に答える 1

3

私は今それを自分で理解しました:

public void SetMouse(int x, int y)
{
    float xpos = 2.0f * ((float)x / (float)_width) - 1.0f;
    float ypos = 2.0f* (1.0f - (float)y / (float)_height) - 1.0f;

    Vector4 startRay = new Vector4(xpos, ypos, -1, 1);
    Vector4 endRay = new Vector4(xpos, ypos, 1, 1);


    Matrix4 trans = _modelView.Data * _projection.Data;
    trans.Invert();
    startRay = Vector4.Transform(startRay, trans);
    endRay = Vector4.Transform(endRay, trans);

    _pickFrom = startRay.Xyz / startRay.W;
    _pickTo = endRay.Xyz / endRay.W;
}

...。

public float Distance(Vector3 p)
{
    Vector3 x1 = _pickFrom;
    Vector3 x2 = _pickTo;

    return Vector3.Cross
    (Vector3.Subtract(p, x1), 
     Vector3.Subtract(p, x2)
    ).Length / Vector3.Subtract(x2, x1).Length;
}
于 2012-12-26T14:49:06.413 に答える