MonoGame VertexPositionColor рисует в неправильном месте

#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. спасибо, я проверю это. Хорошего дня / ночи / вечера / утра / дня!