2016-04-08 8 views
1

Как я понял, матрица проекции масштабирует многоугольник в зависимости от того, как далеко или близко от камеры. Хотя я мог быть совершенно неправ. Мой вопрос в том, как матрица проекции «знает», чтобы показать стороны следующих cube, когда камера движется, когда матрица является только предполагаемым «масштабным» полигоном?Матрица проекций делает больше, чем масштабирование, правильно?

Обратите внимание, что на изображении куб выключен в правой части экрана, перемещая камеру влево. Если камера перемещается в противоположном направлении (вправо), чтобы центрировать куб, сторона куба исчезнет, ​​как ожидалось.

Вот мой матричный код:

private void createProjectionMatrix(){ 
     float aspectRatio = (float) Display.getWidth()/(float) Display.getHeight();   
     float y_scale = (float) ((1f/Math.tan(Math.toRadians(FOV/2f))) * aspectRatio);   
     float x_scale = y_scale/aspectRatio;   
     float frustum_length = FAR_PLANE - NEAR_PLANE;     
     projectionMatrix = new Matrix4f(); 
     projectionMatrix.m00 = x_scale;   
     projectionMatrix.m11 = y_scale;   
     projectionMatrix.m22 = -((FAR_PLANE + NEAR_PLANE)/frustum_length);   
     projectionMatrix.m23 = -1;   
     projectionMatrix.m32 = -((2 * NEAR_PLANE * FAR_PLANE)/frustum_length);   
     projectionMatrix.m33 = 0; 
} 

ответ

2

Функция матрицы проекции (в контексте графических интерфейсов, таких как OpenGL) является преобразование позиции вершин из вида пространства в клип-пространстве.

Клип-пространство обычно представляет собой единичный блок (хотя в D3D это коробка с половинной единицей). Если позиция вершины после преобразования в пространство клипа не лежит внутри этого блока, то она обрезается. Это, по сути, то, как система «знает» куб видна на экране.

+0

Хотя это отвечает, что куб все еще отображается на экране, он не отвечает, как он обновляет положение кубов при перемещении камеры. Возможно, вы можете объяснить дальше или предоставить визуальные подробности? – reddish

+0

У меня нет вашей программы, поэтому предоставление визуальных эффектов практически невозможно ... Движение камеры обычно обрабатывается матрицей вида, а не матрицей проецирования. Обычно есть три матрицы, которые определяют, как объект заканчивается в пространстве клипов: матрица модели (ориентация и положение объекта «в мире»), матрица вида (ориентация, положение «камеры») и проекционный матрикс (как проецируется представление камеры). Если представление изменится, это приведет к изменению положения куба в пространстве клипов - если изменение достаточно велико, оно может быть вне рамки клипа. – MuertoExcobito

+0

Благодарим вас за ответ. Но даже после отключения каждой другой матрицы стороны вышеупомянутого треугольника все еще отображаются правильно. Я просто хочу знать «как» проекционной матрицы для отображения/скрытия сторон куба. – reddish