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