#c# #xna #monogame
#c# #xna #моногейм
Вопрос:
Я пытаюсь создать библиотеку рендеринга для monogame, и в настоящее время я работаю над рисованием 2D-полигонов. Однако позиции не имеют никакого смысла. Каким-то образом, рисуя их в (0, 0, 0), (100. 0, 0), (0, 100, 0), и (100, 100, 0) не достигает левой верхней координаты (0, 0). Как мне это исправить?
Мой код:
BasicEffect basicEffect = new BasicEffect(GraphicsDevice);
VertexPositionColor[] vert = new VertexPositionColor[4];
vert[0].Position = new Vector3(0, 0, 0);
vert[1].Position = new Vector3(100, 0, 0);
vert[2].Position = new Vector3(0, 100, 0);
vert[3].Position = new Vector3(100, 100, 0);
short[] ind = new short[6];
ind[0] = 0;
ind[1] = 2;
ind[2] = 1;
ind[3] = 1;
ind[4] = 2;
ind[5] = 3;
foreach (EffectPass effectPass in basicEffect.CurrentTechnique.Passes)
{
effectPass.Apply();
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
PrimitiveType.TriangleList, vert, 0, vert.Length, ind, 0, ind.Length / 3);
}
РЕЗУЛЬТАТ: https://imgur.com/GkyqmlY
Ответ №1:
MonoGame использует другое начало координат для 2D и 3D систем координат. В 2D (0, 0) — верхний левый угол, а Y увеличивается к нижней части экрана. В 3D (0,0,0) является центром экрана, а координатная сетка работает очень похоже на математику — подумайте о 4 квадрантах в математике, если вы «выровняете» ось z.
Вы рисуете в квадранте I. Если вы хотите, чтобы рисунок основывался на верхнем левом углу, вам нужно перевести ваши вершины на -1 / 2 ширины вашего окна просмотра и 1/2 высоты вашего окна просмотра.
Комментарии:
1. Спасибо! Остаются ли длины единиц одинаковыми? (НАПРИМЕР: является ли добавление 1 к координате x в 3D эквивалентным добавлению 1 к координате x в 2D?)
2. Не совсем. Обычно вы используете камеру с 3D, которая может значительно изменить представление ваших фигур. Я могу нарисовать квадрат размером 2×2 пикселя в 2D, и он займет весь экран… Таким образом, добавление 1 изменится на 1 единицу , но результирующий рисунок может вообще не измениться на 1 пиксель
3. Хорошо, спасибо. Знаете ли вы какой-либо способ нарисовать эти вершины в 2D-координатах или преобразовать координаты в / из 2D-координат? Я действительно ценю помощь, кстати.
4. Посмотрите на github.com/craftworkgames/MonoGame . Расширенный — множество интересных дополнений, включая 2D-камеру и
SpriteBatch
расширения (напримерSpriteBatch.DrawCircle()
, и т. Д.). Это открытый исходный код, лицензия MIT, поэтому вы можете использовать его, адаптировать к вашим потребностям и т. Д.5. спасибо, я проверю это. Хорошего дня / ночи / вечера / утра / дня!