2013-02-02 144 views
0

我对每个世界,视图和投影转换都有一个SlimDX矩阵。根据http://msdn.microsoft.com/en-gb/library/windows/desktop/bb147302(v=vs.85).aspx,投影变换离开(-1,1)^ 3立方体中的坐标。如何将鼠标转换为世界坐标?

我认为通过将鼠标相对于渲染目标的位置转换为投影空间(即将其缩放到(-1,1)范围内并将其固定在-1轴上),然后应用倒转的worldview投射。

下面的代码显示了我的尝试。我的测试是运行应用程序并使用鼠标滚轮放大和缩小,并查看打印的X坐标是否改变,同时将鼠标光标放在窗口的左边缘 - 它不会在某处出现错误。

form.MouseMove += (obj, eargs) => 
     { 
      SlimDX.Matrix worldview = SlimDX.Matrix.Multiply(SlimDX.Matrix.Identity, viewMatrix); 
      SlimDX.Matrix worldviewprojection = SlimDX.Matrix.Multiply(worldview, projectionMatrix); 
      worldviewprojection.Invert(); 

      var pointX = (float)((2.0 * ((float)eargs.Location.X)/(float)form.Width) - 1.0f); 
      var pointY = (float)((2.0 * (((float)eargs.Location.Y)/(float)form.Height)) - 1.0f) * -1.0f; 
      var mouseInProjectionSpace = new Vector4(pointX, pointY, -1.0f, 1.0f); 
      var mouseInWorldSpace = Vector4.Transform(mouseInProjectionSpace, worldviewprojection); 
      Console.WriteLine(mouseInWorldSpace); 
     }; 

     form.MouseWheel += (_, __) => 
      { 
       if (__.Delta > 0) 
        cam.Z /= 2.0f; 
       else 
        cam.Z *= 2.0f; 
       viewMatrix = GetView(cam); 
       Console.WriteLine("zzz="+cam.Z); 
      }; 

任何帮助表示赞赏

+0

“mouseInWorldSpace”的例子是怎么样的?你是否用它的w分量来划分它?你可以用z = 0而不是-1来试试吗? – Gnietschow

回答

0

您的z是错误的,因为在射影空间,z是0(近平面)至1(远平面)

所以它的作用:

Vector2 mouse = //Normalized as -1 to 1 (as you did) 
Vector3 orig = new Vector3(mouse.X,mouse.Y,0.0f); 
Vector3 far = new Vector3(mouse.X,mouse.Y,1.0f); 

//This gets mouse position on near plane 
Vector3 origin = Vector3.TransformCoordinate(orig,worldviewprojectioninverse); 

//This gets mouse position on far plane 
Vector3 posfar = Vector3.TransformCoordinate(far,worldviewprojectioninverse); 
相关问题