2011-12-06 4 views
0

私はOpenTKをC#で使用していますが、ここ数時間は壁を打っています。さまざまなz値のOpentTK + Glu.UnProject()は重複した点を与えません

Glu.UnProject()を使用して、ユーザーがクリックした宇宙を介してレイを作成しようとしています。トレースする光線は、投影面に垂直な線であるため、ユーザーには見えないようにする必要があります。

問題は、基本的なカメラ位置を使用しているときには光線が目に見えないことです。カメラ(cameraXとcameraY)を動かすと、DrawLineからの線がUIに表示されます。近点と遠点は、カメラの「目」と同一直線上にありません!

私はここに問題のあるコードを分離:

glSurface_Paint(Object sender, PaintEventArgs e) { 
    double time = stopwatch.ElapsedMilliseconds * TimeScale + stopwatchOffset; 

    GL.MatrixMode(MatrixMode.Projection); 
    GL.LoadIdentity(); 

    Glu.Perspective(10, (double)Width/Height, nearClip, farClip); 

    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
    GL.MatrixMode(MatrixMode.Modelview); 
    GL.LoadIdentity(); 
    Glu.LookAt(cameraX, cameraY, cameraZ * scaleFactor, 0, 0, 0, 0, 1, 0); 
    GL.ClearColor(Color.DarkGray); 

    if (ShowGrid) { 
    DrawGrid(); 
    } 

    DrawLine(); 

    glSurface.SwapBuffers(); 
} 

をここでDrawLineです。これは、ハードコーディングされた値を使用して、近(z = 0)プレーンと遠(z = 1)プレーンの点を(100,200)でアンプロットします。次に、これら2つの点の間に線を引くだけです。

public void DrawLine() { 
    int[] viewport = new int[4]; 
    double[] modelMatrix = new double[16]; 
    double[] projMatrix = new double[16]; 

    GL.GetInteger(GetPName.Viewport, viewport); 
    GL.GetDouble(GetPName.ModelviewMatrix, modelMatrix); 
    GL.GetDouble(GetPName.ProjectionMatrix, projMatrix); 

    Vector3 clickNearPoint; 
    Glu.UnProject(new Vector3(100, 200, 0), modelMatrix, projMatrix, viewport, out clickNearPoint); 

    Vector3 clickFarPoint; 
    Glu.UnProject(new Vector3(100, 200, 1), modelMatrix, projMatrix, viewport, out clickFarPoint); 

    nearPoint = new Point3D(clickNearPoint.X, -clickNearPoint.Y, clickNearPoint.Z); 
    farPoint = new Point3D(clickFarPoint.X, -clickFarPoint.Y, clickFarPoint.Z); 

    if (nearPoint.HasValue && farPoint.HasValue) { 
    GL.Color3(Color.White); 

    GL.Begin(BeginMode.Lines); 
    GL.Vertex3(nearPoint.Value.X, nearPoint.Value.Y, nearPoint.Value.Z); 
    GL.Vertex3(farPoint.Value.X, farPoint.Value.Y, farPoint.Value.Z); 
    GL.End(); 
    } 
} 

ここに問題のスクリーンショットがあります。左の線は表示されません!

enter image description here

私は時間のためにこれを調査してきたし、私がしようとするもののうち、です。どんな入力も大きな助けになるでしょう。

PS。白い線は、光源と、問題を示すのに必要でないすべてのものを取り除いたため、黒く表示されます。

答えて

1
Vector3 clickNearPoint; 
    Glu.UnProject(new Vector3(100, 200, 0), modelMatrix, projMatrix, viewport, out clickNearPoint); 

    Vector3 clickFarPoint; 
    Glu.UnProject(new Vector3(100, 200, 1), modelMatrix, projMatrix, viewport, out clickFarPoint); 

    nearPoint = new Point3D(clickNearPoint.X, -clickNearPoint.Y, clickNearPoint.Z); 
    farPoint = new Point3D(clickFarPoint.X, -clickFarPoint.Y, clickFarPoint.Z); 
              ^
              ^

返されるY座標を否定するのはなぜですか?これはおそらく問題の原因です。

+0

私は本当に疲れているに違いない。マウスの位置が逆転しているので、Y値をクリックから画面に反転する必要がありました。なぜマウス座標の代わりにポイントを反転させるのか説明できません。それはとてもばかげている。私はそれを今日後で試し、それがそれだったら答えを受け入れるために戻ってきます。ありがとう! –

+0

あなたは正しいです。そんなばかげたミス! –

関連する問題