Directx 如何将鼠标转换为世界坐标?

Directx 如何将鼠标转换为世界坐标?,directx,mouse,slimdx,Directx,Mouse,Slimdx,我有一个SlimDX矩阵,用于每个世界、视图和投影变换。根据投影变换,在(-1,1)^3立方体中留下坐标 我认为,通过将鼠标相对于渲染目标的位置平移到投影空间(即,将其缩放到(-1,1)范围,并将其固定在z轴上的-1),然后应用反向worldviewprojection 下面的代码显示了我的尝试。我的测试是运行应用程序,使用鼠标滚轮放大和缩小,并查看打印的X坐标是否发生变化,同时将鼠标光标保持在窗口的左边缘上-不会发生变化,因此某些地方一定出了问题 form.MouseMove += (obj,

我有一个SlimDX矩阵,用于每个世界、视图和投影变换。根据投影变换,在(-1,1)^3立方体中留下坐标

我认为,通过将鼠标相对于渲染目标的位置平移到投影空间(即,将其缩放到(-1,1)范围,并将其固定在z轴上的-1),然后应用反向worldviewprojection

下面的代码显示了我的尝试。我的测试是运行应用程序,使用鼠标滚轮放大和缩小,并查看打印的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);
            };

任何帮助都是错误的,因为在射影空间中,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);

mouseInWorldSpace
的示例是什么样子的?你把它除以w分量了吗?你能用z=0而不是-1来试试吗?