将SpriteBatch移至3D空间坐标

时间:2018-10-26 18:42:19

标签: c# xna monogame spritebatch spritefont

我想在3D空间中的特定位置绘制文本和图像。 场景以3D渲染,我想在XYZ坐标上显示渲染的2D文本和图像。

我有来自场景和ViewPort的“世界”,“视图”,“投影矩阵”。 我不想渲染真实的3D字体,也不想显示带有纹理顶点的图像。

我已经尝试了一些与变换矩阵的矩阵乘法,并且还尝试将基本效果用作begin-method的参数。但是他们都不为我工作。

        eff.World = Graph3DGame.Current.currentWorld;
        eff.View = Graph3DGame.Current.currentView;
        eff.Projection = Graph3DGame.Current.currentPerspective;

        spriteBatch.Begin(0, null, null, null, null, eff);
        spriteBatch.DrawString(Fonts.Math, "hello, world!", new Vector2(100,100), Color.Blue);
        spriteBatch.End();

希望任何人都可以提供帮助。

1 个答案:

答案 0 :(得分:2)

如果具有x,y,z坐标,则可以通过使用视口投影3d坐标来在屏幕上找到实际对应的2d坐标。基本上这应该可行:

var position3d = new Vector3(1,1,1);

var viewport = GraphicsDevice.Viewport;
var position2d = viewport.Project(position3d, projectionMatrix, viewMatrix, worldMatrix);

position2d值将具有z值,您可以根据需要忽略该值。

然后,您可以使用此控件为您绘制文本(如果您希望我居中):

var text = "Hello, world!";
var measure = myFont.Measure("Hello, world!");

var centeredPosition = new Vector2(position2d.X - measure.X / 2, position2d.Y - measure.Y / 2);

spriteBatch.Begin();
spriteBatch.DrawString(myFont, text, centeredPosition, Color.Blue);

希望有帮助。