Использование CreateOrthographicOffCenter в XNA - PullRequest
3 голосов
/ 11 июня 2010

Я пытаюсь понять, как рисовать графику в XNA, и кто-то другой предложил это. Но прежде чем я попытаюсь использовать это ...

Если я создам и использую эту камеру и установлю LEFT, TOP на 0 и WIDTH = 256 и HEIGHT = 240, что-нибудь, что я отобразлю на экране будет использовать эти координаты? Таким образом, поле с шириной и высотой 1, если установлено значение 0,0, будет занимать пространство от 0,0 до 1,1?

1 Ответ

14 голосов
/ 11 июня 2010

Функция, на которую вы ссылаетесь: Matrix.CreateOrthographicOffCenter(left, right, bottom, top, zNearPlane, zFarPlane).

Возвращает матрицу проекции, которую можно использовать для преобразования точки в мировом пространстве в точку в пространстве проекций.

Пространство проекции идет от (-1, -1) в нижнем левом углу окна просмотра до (1,1) в верхнем правом углу. Это пространство координат, в котором фактически работает графический процессор при растеризации.

Пространство мира - это то, что вы хотите.

Допустим, вы создали матрицу с Matrix.CreateOrthographicOffCenter(0, 256, 240, 0, -10, 10), и вы использовали эту матрицу в качестве матрицы проекции с BasicEffect для рисования модели куба. Допустим, модель куба центрирована в начале координат и имеет размер 1 (длина, ширина и высота).

Как и basicEffect.Projection, вы должны установить basicEffect.View = Matrix.Identity (потому что мы не хотим дополнительного преобразования камеры) и basicEffect.World = Matrix.CreateTranslation(0.5f, 0.5f, 0), чтобы перевести вашу модель так, чтобы она существовала от (0,0) до (1, 1) в мировом пространстве. Затем нарисуйте вашу модель, используя этот BasicEffect.

Верхняя грань вашего куба (орфографическая проекция означает отсутствие перспективы) будет нарисована в верхнем левом углу области просмотра. Он займет 1/25 ширины и 1/240 высоты окна просмотра (см. Также GraphicsDevice.Viewport).

(PS: я не могу вспомнить, как влияет на выбраковку задней поверхности этот вид проекции. Если вы ничего не видите, попробуйте отключить его или изменить порядок намотки.)


Теперь, как говорится, из ваших других вопросов (и того факта, что вы хотите создать орфографическую матрицу) я понял, что вы хотите работать с 2D-спрайтами. BasicEffect предназначен в первую очередь для выполнения 3D-работы (хотя, если вы создаете свой собственный вершинный шейдер, не рекомендуется для спрайтов, вам потребуется матрица проекции).

Вы, вероятно, хотите использовать SpriteBatch XNA - не в последнюю очередь потому, что он сильно оптимизирован для рисования спрайтов. SpriteBatch.Begin примет Matrix transformMatrix в качестве аргумента. Это эквивалентно матрице World and View, приведенной выше, , а не матрице проекции.

SpriteBatch предполагает, что ваше мировое пространство совпадает с пространством клиента (верхний левый угол равен (0,0), ширина и высота - это размер области просмотра) и обрабатывает проекцию за вас. (На самом деле он более продвинутый, чем этот - он будет применять смещение, чтобы пиксели спрайта совпали с пикселями экрана.)

Если вы хотите рисовать спрайты так, чтобы мир отображался в окне шириной 256 единиц и высотой 240 единиц, вы можете передать такую ​​матрицу SpriteBatch.Begin:

Matrix.CreateScale(viewport.Width / 256f, viewport.Height / 240f, 1f)

Стоит отметить, что в новой XNA 4.0 вы можете использовать SpriteBatch для рисования с помощью пользовательских вершинных шейдеров , и, таким образом, вы можете использовать произвольные матрицы проектов мировоззрения.

...