opengl - 3Dポイントを2Dスクリーン座標に投影するOpenTK

opengl 3d projection opentk

MonotouchとOpenTKを使用して、1つの3Dポイントの画面座標を取得しようとしています。ワールドビューの投影行列を設定しました。OpenGLはそれを理解して3Dモデルを完全に投影しますが、同じ行列を使用して2Dから3Dに1点だけを投影する方法は?

私は単に使用できると思いました:

Vector3.Transform(ref input3Dpos, ref matWorldViewProjection, out projected2Dpos);


次に、projected2DPosで投影画面の座標を調整します。しかし、結果のVector4は適切な投影スクリーン座標を表していないようです。そして、私はそれからそれを計算する方法がわかりません。



Vector4.wで除算する必要があることがわかりましたが、まだ間違った値を取得しています。この方法を今使用:

private static bool GluProject(OpenTK.Vector3 objPos, OpenTK.Matrix4 matWorldViewProjection, int[] viewport, out OpenTK.Vector3 screenPos)
{
    OpenTK.Vector4 _in;

    _in.X = objPos.X;
    _in.Y = objPos.Y;
    _in.Z = objPos.Z;
    _in.W = 1f;

    Vector4 _out = OpenTK.Vector4.Transform(_in, matWorldViewProjection);

    if (_out.W <= 0.0)
    {
        screenPos = OpenTK.Vector3.Zero;
        return false;
    }

    _out.X /= _out.W;
    _out.Y /= _out.W;
    _out.Z /= _out.W;
    /* Map x, y and z to range 0-1 */
    _out.X = _out.X * 0.5f + 0.5f;
    _out.Y = -_out.Y * 0.5f + 0.5f;
    _out.Z = _out.Z * 0.5f + 0.5f;

    /* Map x,y to viewport */
    _out.X = _out.X * viewport[2] + viewport[0];
    _out.Y = _out.Y * viewport[3] + viewport[1];

    screenPos.X = _out.X;
    screenPos.Y = _out.Y;
    screenPos.Z = _out.Z;

    return true;
}


しかし、エラーは表示されません...:S
答え
最初の質問では、最後のステップであるNDC(Normalized Device Coordinates)からビューポート座標へのマッピングがありません。それが行です

/* Map x,y to viewport */
_out.X = _out.X * viewport[2] + viewport[0];
_out.Y = _out.Y * viewport[3] + viewport[1];


あなたのGluProjectで、
関連記事

opengl - OpenGL頂点バッファーが描画されない(LWJGL)

c++ - OpenGL 2.1でのglDrawRangeElementsの使用

opengl - JOGLテクスチャの問題

c++ - SDL OpenGL C++の問題

java - Javaで「ウォーターフォール」シミュレーションを実装する

opengl - OpenGL描画時間

java - openGL / JOGL:一部のテクスチャが「スムーズ」にレンダリングされ、一部がレンダリングされないのはなぜですか?

opengl - OpenGLで異なる独立したオーバーラップレイヤーを使用する方法

performance - OpenGLを使用して等高線レンダリングのパフォーマンスを向上させますか?

android - OpenGLテクスチャを動的にロードおよびアンロードする必要があります