【发布时间】: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)分配一个世界位置,然后在渲染时将其转换为屏幕位置(我编写了使用世界位置而不是屏幕位置的自定义绘制命令)..