我正在编写一个2D游戏,其中我的游戏世界的x轴从左到右,y轴从上到下,z轴在屏幕外:
尽管我的游戏世界是自上而下的,但游戏的渲染却略有倾斜:
我正在研究从世界空间到屏幕空间的投影,反之亦然。我的前者工作如下:
var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);
该NegateY()
扩展方法不正是它听起来像,因为XNA的Ÿ线延伸自下而上,而不是自上而下。上面的屏幕截图显示了所有工作。基本上,我在3D空间中有一堆点,然后在屏幕空间中进行渲染。我可以实时修改相机属性,并看到它动画到新位置。显然,我的实际游戏将使用精灵而不是点,并且摄影机的位置将被固定,但是我只是在尝试所有数学运算之前。
现在,我正在尝试以另一种方式转换。也就是说,给定上方屏幕空间中的x和y点,请确定世界空间中的相应点。因此,如果将光标指向绿色梯形的左下角,则希望获得世界空间读数(0,480)。该ž坐标无关。或者,当映射回世界空间时,z坐标将始终为零。本质上,我想实现此方法签名:
public Vector2 ScreenPointToWorld(Vector2 point)
我已经尝试了几种方法来使它正常工作,但是没有运气。我最近的想法是,我需要调用Viewport.Unproject
近两次不同/远ž值,计算得到的Ray
,规范它,然后计算出的交点Ray
有Plane
,基本上代表了我的世界的地面。但是,我陷入了最后一步,不确定是否使事情变得过于复杂。
谁能为我指出如何实现这一目标的正确方向?