C# XNA将鼠标位置转换为三维坐标

C# XNA将鼠标位置转换为三维坐标,c#,xna,C#,Xna,我使用数组绘制了一个3D网格,希望能够用鼠标选择一个单独的瓷砖,但似乎无法正确获得3D位置。 我从0,0,0开始,用2个三角形绘制网格的每个正方形,但当将光标放在左下角时,我得到的数据类似于X 0.823,Y 0.676 我用于鼠标坐标的代码如下 MouseState ms = Mouse.GetState(); Vector3 nearScreenPoint = new Vector3(ms.X, ms.Y, 0f); Vector3 farS

我使用数组绘制了一个3D网格,希望能够用鼠标选择一个单独的瓷砖,但似乎无法正确获得3D位置。 我从0,0,0开始,用2个三角形绘制网格的每个正方形,但当将光标放在左下角时,我得到的数据类似于X 0.823,Y 0.676 我用于鼠标坐标的代码如下

        MouseState ms = Mouse.GetState();

        Vector3 nearScreenPoint = new Vector3(ms.X, ms.Y, 0f);
        Vector3 farScreenPoint = new Vector3(ms.X, ms.Y, 1f);
        Vector3 nearWorldPoint = device.Viewport.Unproject(nearScreenPoint, projection, view, world);
        Vector3 farWorldPoint = device.Viewport.Unproject(farScreenPoint, projection, view, world);

        Vector3 direction = farWorldPoint - nearWorldPoint;
        direction.Normalize();

        Ray r = new Ray(nearWorldPoint, direction);

        Plane p = new Plane(0, 1, 0, 0f);

        // calculate distance of intersection point from r.origin
        float denominator = Vector3.Dot(p.Normal, r.Direction);
        float numerator = Vector3.Dot(p.Normal, r.Position) + p.D;
        float t = -(numerator / denominator);

        Vector3 pickedPosition = nearWorldPoint + direction * t;

        spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
        spriteBatch.DrawString(font, "" + fps + "    " + pickedPosition.X + "    -    " + pickedPosition.Z, new Vector2(100, 100), Color.Black);
        spriteBatch.End();
在网格上绘制单个正方形的代码

        Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, device.Viewport.AspectRatio, 1.0f, 1000.0f);
        Matrix world = Matrix.CreateTranslation(new Vector3(0, 0, 0));
        Matrix view = Matrix.CreateLookAt(new Vector3(xPos, yPos, zHeight), new Vector3(xPos, yPos + zRotation, 0), new Vector3(0, 5, 0));


        foreach (EffectPass pass in grassEffect.CurrentTechnique.Passes)
        {
            pass.Apply();

            VertexPositionTexture[] vertices = createCubeTexture(0, 0, 1, 0f);
            device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 2, VertexPositionTexture.VertexDeclaration);
        }
最后是正方形创建代码

    private VertexPositionTexture[] createCubeTexture(float xlocation, float ylocation, float size, float zlocation)
    {
        VertexPositionTexture[] vertices;

        vertices = new VertexPositionTexture[6];

        vertices[0].Position = new Vector3(xlocation - size, ylocation - size, zlocation);
        vertices[0].TextureCoordinate.X = 0;
        vertices[0].TextureCoordinate.Y = 1;
        vertices[1].Position = new Vector3(xlocation - size, ylocation + size, zlocation);
        vertices[1].TextureCoordinate.X = 0;
        vertices[1].TextureCoordinate.Y = 0;
        vertices[2].Position = new Vector3(xlocation + size, ylocation - size, zlocation);
        vertices[2].TextureCoordinate.X = 1;
        vertices[2].TextureCoordinate.Y = 1;
        vertices[3].Position = new Vector3(xlocation - size, ylocation + size, zlocation);
        vertices[3].TextureCoordinate.X = 0;
        vertices[3].TextureCoordinate.Y = 0;
        vertices[4].Position = new Vector3(xlocation + size, ylocation + size, zlocation);
        vertices[4].TextureCoordinate.X = 1;
        vertices[4].TextureCoordinate.Y = 0;
        vertices[5].Position = new Vector3(xlocation + size, ylocation - size, zlocation);
        vertices[5].TextureCoordinate.X = 1;
        vertices[5].TextureCoordinate.Y = 1;

        return vertices;
    }

指定了错误的平面法线。它应该是一个常数,而不是取决于鼠标位置的东西。或者你的飞机移动了?我应该如何使它正常化?它们可以更改旋转并四处移动,但栅格在其所在位置保持平坦。我对3d非常陌生,以防你说不出来:P尝试转换2D游戏,证明比我想象的要困难。如果网格在x-z平面上总是平的,然后使用0,1,0的法线。我尝试过,我得到的似乎是随机数。。。它们似乎与我画正方形的地方没有关联。你能更新代码并发布一些示例值吗?y分量应始终为0。