【问题标题】:XNA 2D convert a world position into screen positionXNA 2D 将世界位置转换为屏幕位置
【发布时间】:2011-12-23 10:13:32
【问题描述】:

好的,伙计们,我花了整整两个星期试图弄清楚这一点。我已经尝试了一些自己的方法来仅通过数学来解决这个问题,但没有成功。我也到处找,看到有人推荐Viewport.Project()

这不是那么简单。我看过的所有地方,包括 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 是相机位置。我的游戏是二维的,所以vector3很烦我想也许我的Z可能是CameraZoom,投影可能是我们要转换为2D屏幕的对象,视图可能是相机可以看到的大小,最后一个我是没有把握。

在搜索信息大约 2 周后,代码或知识没有任何改进,并且在查看 MDSN 教程时更加困惑,我决定发布一个问题,因为我非常接近于不实现世界位置转换到屏幕位置。感谢所有帮助:)

另外,我使用的是 2D 游戏,当大多数时候人们谈论 Z 轴时,当 2D 游戏没有 Z 轴时,它确实会增加混淆,它只是将精灵转换为看起来像缩放或移动。再次感谢:)

【问题讨论】:

  • 所以你想要做的只是在 2d 游戏的世界中安装一个摄像头?
  • 我已经设置好了相机,我正在尝试在 2D 世界中找到 2D 相机的位置,然后将世界中对象的位置转换为屏幕坐标以显示名称或健康等文本在物体等上。 PS我的相机有变焦也可以旋转,但我不使用旋转
  • 你不会只是从物体的世界位置中减去相机的世界位置来得到屏幕位置吗?然后你需要考虑缩放。我一直在做的只是为所有东西(除了 hud)分配一个世界位置,然后在渲染时将其转换为屏幕位置(我编写了使用世界位置而不是屏幕位置的自定义绘制命令)..

标签: xna position screen 2d


【解决方案1】:

我在这里可能会产生误解,但我认为您不需要使用 XNA 提供的 3D 相机来进行 2D 游戏。除非您尝试使用 3D 为某种视差系统或其他方式制作 2.5D 游戏,否则您根本不需要使用它。看看这些:

2D Camera Implemetation in XNA

Simpler 2D Camera

XNA 2D tutorials

XNA 中的 2D 与 3D 的工作方式不同。您无需担心 3D 视口或 3D 相机或任何东西。没有近剪裁或远剪裁。 2D 在 XNA 中处理得很好,我认为你对 XNA 的工作方式有点误解。

PS:你不需要使用 Vector3s。相反,使用 Vector2s。我想你会发现它们在 2D 游戏中更容易使用。 ^^

【讨论】:

  • hey kevin wang 指向 Simpler 2D 相机的链接是我的相机 :D 但我将相机位置从屏幕中间更改为 0,0 以获取鼠标世界坐标,请继续阅读其他教程并让不过你知道
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 2015-02-09
  • 2012-07-17
  • 1970-01-01
  • 2021-07-01
  • 2018-07-04
  • 1970-01-01
相关资源
最近更新 更多