XNA преобразует положение мыши в 3D-координаты

#c# #xna

#c# #xna

Вопрос:

Я нарисовал 3D-сетку с использованием массива и хочу иметь возможность выбирать отдельные плитки с помощью мыши, но, похоже, не могу правильно определить 3D-положение. Я рисую каждый квадрат сетки из двух треугольников, начиная с 0,0,0, но при наведении курсора в нижний левый угол я получаю данные типа 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);
        }
  

И, наконец, код создания square

     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;
    }
  

Комментарии:

1. Вы указали неправильную нормальную плоскость. Вероятно, это должно быть константой, а не чем-то, что зависит от положения мыши. Или ваша плоскость движется?

2. Как я должен это нормализовать? Они могут изменять поворот и перемещаться, но сетка остается плоской, где она есть. Я очень новичок в 3D-материалах, на случай, если вы не можете сказать: P Пытаюсь конвертировать 2D-игру, что оказывается сложнее, чем я думал

3. Если сетка всегда плоская в плоскости x-z, тогда используйте нормаль (0, 1, 0) .

4. Я пробовал это, и я получаю такие же, казалось бы, случайные числа… Кажется, они никогда не соотносятся с тем, где я вообще рисую квадраты

5. Можете ли вы обновить код и опубликовать некоторые примеры значений? Y-компонент всегда должен быть равен 0.