#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.