2012-04-26 19 views
0

私の基本的な質問は、「gluUnProject」を使用してマウス/カーソル位置からレイまたは法線ベクトルを取得する正しい方法です。'gluUnProject'からレイを取得するには

私は 'gluUnProject'コードをC#にメサグルCコードから変換しました。

public Vector3 UnProject(Matrix4 projectionMatrix, Matrix4 viewMatrix, int viewX, int viewY, int viewWidth, int viewHeight) 
{ 
    var finalMatrix = viewMatrix.Multiply(projectionMatrix).Invert(); 

    var vec = new Vector4(this, 1); 
    vec.X = (vec.X - viewX)/viewWidth; 
    vec.Y = (vec.Y - viewY)/viewHeight; 
    vec = (vec * 2) - 1; 
    vec.Y = -vec.Y; 

    var outVec = vec.Transform(finalMatrix); 
    outVec.X /= outVec.W; 
    outVec.Y /= outVec.W; 
    outVec.Z /= outVec.W; 

    return outVec.ToVector3(); 
} 

私はその後、私のCameraオブジェクトからこのメソッドを呼び出します。

public Vector3 UnProject(Vector3 screenPosition) 
{ 
    return screenPosition.UnProject(ProjectionMatrix, ViewMatrix, ViewPort.Location.X, ViewPort.Location.Y, ViewPort.Size.X, ViewPort.Size.Y); 
} 

私は光線から私の法線ベクトルを取得するには:私は私のルックアットを移動するまで

var rayLoc = camera.UnProject(new Vector3(Game.Mouse.Location, 0)); 
var rayLoc2 = camera.UnProject(new Vector3(Game.Mouse.Location, 1)); 
var rayDirection = (rayLoc2 - rayLoc).Normalize(); 

すべてが正常に動作しますXで1を指し、カメラをX軸とY軸上で少し回転させます。その後、ベクトルはもはや正しいものではない。私は何が間違っているのか分からない?

EDIT:私のMatrix4.Invertメソッドが近づいたと思うのですが、それが原因かもしれません。私は行メジャー、任意のアイデアを使用しようとしている?

public Matrix4 Invert() 
{ 
    var mat = new Matrix4(
     new Vector4(
      Y.Y*Z.Z*W.W - Y.Y*Z.W*W.Z - Z.Y*Y.Z*W.W + Z.Y*Y.W*W.Z + W.Y*Y.Z*Z.W - W.Y*Y.W*Z.Z, 
      -Y.X*Z.Z*W.W + Y.X*Z.W*W.Z + Z.X*Y.Z*W.W - Z.X*Y.W*W.Z - W.X*Y.Z*Z.W + W.X*Y.W*Z.Z, 
      Y.X*Z.Y*W.W - Y.X*Z.W*W.Y - Z.X*Y.Y*W.W + Z.X*Y.Y*W.Y + W.X*Y.Y*Z.W - W.X*Y.W*Z.Y, 
      -Y.X*Z.Y*W.Z + Y.X*Z.Z*W.Y + Z.X*Y.Y*W.Z - Z.X*Y.Z*W.Y - W.X*Y.Y*Z.Z + W.X*Y.Z*W.Y), 
     new Vector4(
      -X.Y*Z.Z*W.W + X.Y*Z.W*W.Z + Z.Y*X.Z*W.W - Z.Y*X.W*W.Z - W.Y*X.Z*Z.W + W.Y*X.W*Z.Z, 
      X.X*Z.Z*W.W - X.X*Z.W*W.Z - Z.X*X.Z*W.W + Z.X*X.W*W.Z + W.X*X.Z*Z.W - W.X*X.W*Z.Z, 
      -X.X*Z.Y*W.W + X.X*Z.W*W.Y + Z.X*X.Y*W.W - Z.X*X.W*W.Y - W.X*X.Y*Z.W + W.X*X.W*Z.Y, 
      X.X*Z.Y*W.Z - X.X*Z.Z*W.Y - Z.X*X.Y*W.Z + Z.X*X.Z*W.Y + W.X*X.Y*Z.Z - W.X*X.Z*Z.Y), 
     new Vector4(
      X.Y*Y.Z*W.W - X.Y*Y.W*W.Z - Y.Y*X.Z*W.W + Y.Y*X.W*W.Z + W.Y*X.Z*Y.W - W.Y*X.W*Y.Z, 
      -X.X*Y.Z*W.W + X.X*Y.W*W.Z + Y.X*X.Z*W.W - Y.X*X.W*W.Z - W.X*X.Z*Y.W + W.X*X.W*Y.Z, 
      X.X*Y.Y*W.W - X.X*Y.W*W.Y - Y.X*X.Y*W.W + Y.X*X.W*W.Y + W.X*X.Y*Y.W - W.X*X.W*Y.Y, 
      -X.X*Y.Y*W.Z + X.X*Y.Z*W.Y + Y.X*X.Y*W.Z - Y.X*X.Z*W.Y - W.X*X.Y*Y.Z + W.X*X.Z*Y.Y), 
     new Vector4(
      -X.Y*Y.Z*Z.W + X.Y*Y.W*Z.Z + Y.Y*X.Z*Z.W - Y.Y*X.W*Z.Z - Z.Y*X.Z*Y.W + Z.Y*X.W*Y.Z, 
      X.X*Y.Z*Z.W - X.X*Y.W*Z.Z - Y.X*X.Z*Z.W + Y.X*X.W*Z.Z + Z.X*X.Z*Y.W - Z.X*X.Z*Y.Z, 
      -X.X*Y.Y*Z.W + X.X*Y.W*Z.Y + Y.X*X.Y*Z.W - Y.X*X.W*Z.Y - Z.X*X.Y*Y.W + Z.X*X.W*Y.Y, 
      X.X*Y.Y*Z.Z - X.X*Y.Z*Z.Y - Y.X*X.Y*Z.Z + Y.X*X.Z*Z.Y + Z.X*X.Y*Y.Z - Z.X*X.Z*Y.Y)); 

    Num delta = X.X*mat.X.X + X.Y*mat.Y.X + X.Z*mat.Z.X + X.W*mat.W.X; 
    delta = 1/delta; 
    return mat * delta; 
} 

答えて

0

それ私のMatrix4.Invertメソッドが間違っていたことが判明しました。私はRow-Major Invertメソッドを作成する際にOpenTKを参考にしました。

EDIT:実際に'https://github.com/Dav1dde/gl3n'にはもっと良い方法がありました。

0

私は通常、この操作を行います。

xおよびyはマウス座標と深さである
GLint m_viewport[4]; 
GLdouble m_modelview[16]; 
GLdouble m_projection[16]; 

glGetIntegerv(GL_VIEWPORT, m_viewport); 
glGetDoublev(GL_MODELVIEW_MATRIX, m_modelview); 
glGetDoublev(GL_PROJECTION_MATRIX, m_projection); 

GLdouble rx, ry, rz; 
gluUnProject(x, y, depth, m_modelview, m_projection, m_viewport, &rx, &ry, &rz); 

(0、1]の一部の値である - 私は、通常、0.5を取るを

関連する問題