好吧,我已花了两周的时间试图弄清楚这一点。我尝试了一些我自己的方式来单独用数学来解决这个问题,但没有成功。我也到处看,并看到人们推荐Viewport.Project()
。XNA 2D将世界位置转换为屏幕位置
这并不是那么简单。我看过的所有地方,包括MSDN领域和所有论坛,只是建议能够使用它,但是当我尝试和使用它时,他们没有解释它需要工作的矩阵和值。我没有找到有关如何正确使用这种方法的有用信息,它严重地让我疯了。请帮助这个可怜的家伙。
我要做的第一件事是张贴我当前的代码。我有五个左右不同的版本,他们都没有工作。我得到的最接近的是NAN,我不明白。我试图根据小行星的位置在屏幕上显示文字,如果文字非常远,文字将作为指南,以便玩家可以前往小行星。
Vector3 camLookAt = Vector3.Zero;
Vector3 up = new Vector3(0.0f, 0.0f, 0.0f);
float nearClip = 1000.0f;
float farClip = 100000.0f;
float viewAngle = MathHelper.ToRadians(90f);
float aspectRatio = (float)viewPort.Width/(float)viewPort.Height;
Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 0), camLookAt, up);
Matrix projection = Matrix.CreatePerspectiveFieldOfView(viewAngle, aspectRatio, nearClip, farClip);
Matrix world = Matrix.CreateTranslation(camPosition.X, camPosition.Y, 0);
Vector3 projectedPosition = graphicsDevice.Viewport.Project(new Vector3(worldPosition.X, worldPosition.Y, 0), projection, view, Matrix.Identity);
screenPosition.X = projectedPosition.X;
screenPosition.Y = projectedPosition.Y;
if (screenPosition.X > 400) screenPosition.X = 400;
if (screenPosition.X < 100) screenPosition.X = 100;
if (screenPosition.Y > 400) screenPosition.Y = 400;
if (screenPosition.Y < 100) screenPosition.Y = 100;
return screenPosition;
据我所知,Project是相机的位置。我的游戏是2D,所以vector3很烦人我想也许我的Z可能是CameraZoom,投影可能是我们想要转换为2D屏幕的对象,视图可能是相机可以看到的大小,以及我最后一个不确定。
经过大约2周的搜索信息,在代码或知识方面没有可能的改进,并且因为我看到MDSN教程而变得更加困惑时,我决定发布一个问题,因为我非常接近于未实现世界位置转换为屏幕位置。所有帮助表示赞赏谢谢:)
另外我使用的是2D游戏,当人们谈论Z轴的大多数时候,当2D游戏没有Z轴时,它会引起混淆,它只是将变形的精灵看起来像放大或移动。再次感谢:)
所以你想要做的是在2D游戏世界里有一台相机吗? – Ben
我已经拥有相机设置,即时通讯试图找到2D世界中的2D相机的位置,然后将世界中的对象的位置转换为屏幕坐标以显示像名称或健康对象等文本。PS我的相机有缩放也可以旋转,但我不使用旋转 – user1109013
难道你只是从对象的世界位置减去相机的世界位置来获得屏幕位置?然后你需要考虑缩放。我一直在做的事情就是给所有东西分配一个世界位置(除了hud),然后在渲染时将其转换为屏幕位置(我写了使用世界位置而不是屏幕位置的自定义绘图命令)。 – Ben