我有一个基于瓦片的游戏,它是在一个半等距视图中由一个变换创建的。瓷砖是由一个在三维表面上渲染的Texture2d创建的。
我使用以下代码进行转换。
View = Matrix.CreateLookAt(new Vector3(0, -1.1f, 1.6f), new Vector3(0, 0, 0), new Vector3(0, 53, 0));
Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.Pi - 2.4f, 4.0f / 3.0f, 1, 500);
quadEffect = new BasicEffect(device);
quadEffect.World = Matrix.Identity;
quadEffect.View = View;
quadEffect.Projection = Projection;
quadEffect.TextureEnabled = true;
quad = new Quad(new Vector3(0, 0, 0), Vector3.Backward, Vector3.Up, 3, 3);
我的问题是,当我试图获取当前的瓷砖时,我将鼠标悬停在上面。 我有一个鼠标X和Y,但是我似乎不知道如何将这些屏幕坐标转换为瓷砖X和Y。瓷砖是128px×128px的,但是在相机转换后,它们在上面变小,在下面变大(以创建等距视图)。
我试过用相同的投影矩阵变换鼠标X和Y。 然而,这并不奏效。 我认为这是由于没有考虑到视图矩阵的原因......下面的示例。
Vector3.Transform(new Vector3(Mouse.GetState().X, Mouse.GetState().Y, 0), Projection);
投影矩阵控制了3D图像在2D屏幕上的显示方式,但没有任何关于摄像机放置在哪里或指向什么方向的内容,你可能至少要在某处使用带有投影矩阵的视图矩阵,以获得正确的屏幕点到世界点的转换。
我其实不记得做这种变换的数学方法了,但是xna有 非项目法 你可能想看看:)