2013-05-02 3 views
0

Используя OpenTK, я создал окно (800x600) с вертикальным FOV 90 °. Я хочу сделать 2D-игру с фоновым изображением, которое подходит для всего экрана. Что я хочу - это плоскость с переменной z координатой как RectangleF.Получите границы плоскости, видимые с определенной координатой z

В настоящее время мой код:

var y = (float)(Math.Tan(Math.PI/4) * z); 
return new RectangleF(aspectRatio * -y, -y, 2 * aspectRatio * y, 2 * y); 

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

ответ

0

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

Тогда не беспокойтесь о перспективных расчетах. Просто переключитесь на орфографическую проекцию для рисования фона, отключив запись глубины. Затем переключитесь на перспективную проекцию для остальных.

OpenGL - это не граф сцены, это API-интерфейс с полным набором чертежей. Используйте этот факт.

+0

Ну, я на самом деле планировал использовать перспективу масштабирования и, возможно, некоторые 3D-расширения, поэтому переход на орто не является лучшим решением. Кроме того, я больше хочу знать свою ошибку, чем обход. – timedt

+1

@timedev Использование ортопроекции для рисования 2D не является обходным путем, это правильный способ делать вещи. Даже в 3D-играх 2D-оверлеи рисуются с использованием ортопроекций. Чтобы увеличить масштаб, вы можете изменить ортопроекцию так: http://www.opengl.org/discussion_boards/showthread.php/132061-help-with-orthographic-zoom – Ani

+0

@timedev: Это не обходной путь. Это единственный правильный способ и лучшее решение для этого. Никогда не пытайтесь чрезмерно усложнять ситуацию. OpenGL не является сценографом. Вы * предположили *, чтобы переключать прогнозы там, где это необходимо. – datenwolf

0

Чтобы сделать 2D-игру с использованием OpenGL, вы должны использовать орфографическую проекцию, как показано в уроке this.

Тогда его просто заполнить экран любым изображением, которое вы хотите, потому что вы не имеете дело с перспективой.

Тем не менее, ЕСЛИ вы должны были настаивать на том, чтобы делать что-то так, как вы говорите, тогда вам нужно будет по 4 углам экрана использовать текущую модельную матрицу и затем нарисовать квадрат в трехмерном пространстве с этими углами. Даже с помощью этого метода, вероятно, квадрат может не покрывать весь экран иногда из-за ошибок с плавающей запятой.