好吧,我已花了兩週的時間試圖弄清楚這一點。我嘗試了一些我自己的方式來單獨用數學來解決這個問題,但沒有成功。我也到處看,並看到人們推薦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