Переместить SpriteBatch в 3D Space Coordinate - PullRequest
0 голосов
/ 26 октября 2018

Я хочу нарисовать текст и изображение на определенной позиции в 3D-пространстве.Сцена визуализируется в 3D, и я хочу отобразить визуализированный 2D-текст и изображение на XYZ-координате.

У меня есть мир, вид, матрицы проекции со сцены и видовой порт.Я не хочу отображать настоящий 3D-шрифт и не хочу отображать изображение с вершинами текстуры.

Я попробовал некоторые умножения матриц с матрицей преобразования, и я также попытался использовать базовый эффект в качестве параметра для метода begin.Но ни один из них не работал для меня.

        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 голосов
/ 28 октября 2018

Если у вас есть координаты x, y, z, вы можете найти фактическую соответствующую 2D-координату на экране, проецируя 3D-координаты с помощью видового экрана. В основном это должно работать:

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);

Надеюсь, это поможет.

...