Изометрический текст рендеринга в 2D

Как я могу визуализировать текст в виде изометрической проекции? Я понимаю принцип, но я не уверен, как на самом деле преобразовать SpriteFont программно, чтобы это сделать.

Пример того, что я имею в виду:

enter image description here

Я даже не уверен, что я должен искать. Кажется, я мог бы это сделать, используя изометрическую матрицу проекции и трехмерный сетчатый шрифт, но это кажется сложным, учитывая, что я работаю в 2D.

Есть идеи?

2
nl ja de

2 ответы

SpriteBatch.Begin takes a Matrix parameter, transforming the sprites you draw (including SpriteFont) onto whichever plane you desire.

К сожалению, Matrix не предоставляет методы Create * для создания косых матриц. Но достаточно просто создать такую ​​матрицу вручную. Следующий фрагмент кода проверен и близок к тому, что вы хотите:

Matrix skew = Matrix.Identity;
skew.M12 = (float)Math.Tan(MathHelper.ToRadians(36.87f));
Matrix rotate = Matrix.CreateRotationZ(MathHelper.ToRadians(270+26.565f));

sb.Begin(SpriteSortMode.Deferred, null, null, null, null, null, skew * rotate);
// ... draw your sprites here ...
sb.End();

Единственное отличие от вашей диаграммы заключается в том, что Y и Y 'указывают в противоположном направлении, потому что XTR's SpriteBatch работает в координатах «клиент» ((0,0) вверху слева, а Y + - вниз).

2
добавлено
Это работает, однако, положение текста также преобразуется. См. Здесь: i.imgur.com/KAivIok.png В матрице нет компонента перевода, поэтому почему это происходит?
добавлено автор Salis, источник
Это имеет смысл. Спасибо огромное!
добавлено автор Salis, источник
Теперь я хочу испечь преобразованный текст в текстуру через RenderTarget2D. Учитывая размер текста перед преобразованием, как я могу определить размер, который будет после преобразования?
добавлено автор Salis, источник
Я думал, что понял, что ты имеешь в виду, но я думаю, что у меня все перепуталось. Если я правильно понял, то на следующем рисунке красный пиксель в верхней части должен представлять результат SpriteFont.MeasureString, а красный пиксель внизу должен представлять Vector2.Transform в MeasureString code>. ( i.imgur.com/CgLxNdo.png ) Это означало бы, что с самого начала , Значение Vector2.Transform должно быть правильной шириной после преобразования, но это, похоже, не так. Что я недопонимаю?
добавлено автор Salis, источник
Матрицы преобразования преобразуют вершины по всему миру (0,0), а не вокруг собственного происхождения спрайта. Концептуально вы трансформируете весь самолет, на который нарисованы спрайты. Чтобы найти позицию на этой плоскости, которая соответствует требуемой координате экрана, вы должны инвертировать преобразование. Например: Vector2.Transform (screenCoord, Matrix.Invert (skew * rotate)) .
добавлено автор Andrew Russell, источник
@Salis Вы можете использовать комбинацию SpriteFont.MeasureString для определения угловых вершин текста и Vector2.Transform , чтобы преобразовать их. Тогда небольшая математика даст вам размер.
добавлено автор Andrew Russell, источник
Вам нужно получить позиции Vector2 для всех четырех углов и преобразовать все четыре из них. Тогда у вас будет четыре точки в виде алмазной формы. Вам нужно вычислить прямоугольник, который охватывает эти четыре точки (в основном min/max координаты X и Y).
добавлено автор Andrew Russell, источник

Для этого вы можете использовать матричное преобразование вместе со спрайтом. Подробнее о преобразовании матриц можно прочитать здесь .

0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot