Если вы хотите создать свою первую матрицу вида, начните с gluLookAt
.
С помощью этой удобной устаревшей служебной функции OpenGL вы можете определить матрицу вида с помощью позиция (eye
), целевая точка (target
) и вектор повышения (up
):
(см. также Java Примеры кода для org.lwjgl.util.glu.GLU .gluLookAt () )
GLU.gluLookAt(eye.x, eye.y, eye.z, target.x, target.y, target.z, up.x, up.y, up.z);
Пространство вида - это локальная система, которая определяется точкой обзора на сцене. Положение вида, линия взгляда и направление взгляда вверх определяют систему координат относительно мировой системы координат. Объекты сцены должны быть нарисованы относительно системы координат вида, чтобы быть «видимыми» с позиции просмотра. Обратная матрица системы координат вида называется матрица вида . Эта матрица преобразуется из мировых координат для просмотра координат.
Кроме того, вам также понадобится Orthographi c или Проекция Матрица проекции.
Прежняя матрица может быть определена как glOrtho
(См. Также Java Примеры кода для org.lwjgl.opengl.GL11.glOrtho () )
GL11.glOrtho(0, width, height, 0, 1, -1);
и более поздних версий gluPerspective
(См. Также Java Примеры кода для org.lwjgl.util.glu.GLU.gluPerspective () )
GLU.gluPerspective(45.0f, wRatio, (float) near, (float) far);
Матрица проекции описывает отображение от 3D точек сцены до 2D точек окна просмотра. Матрица проекции преобразуется из пространства просмотра в пространство клипа. Координаты в пространстве клипа преобразуются в нормализованные координаты устройства (ND C) в диапазоне (-1, -1, -1) в (1, 1, 1) путем деления на компоненту w
координаты клипа.
В устаревшем OpenGL существуют разные текущие матрицы. Матрица проекции должна быть установлена на текущую матрицу GL_PROJECTION
, а матрица просмотра - на текущую матрицу GL_MODELVIEW
. См. glMatrixMode
.
Например:
float width = ...; // width of the window
float height = ...; // height of the window
Vector3f eye = ...; // camera position
Vector3f target = ...; // camera target
Vector3f up = ...; // camera up vector
float ratio = 1.0f * width / height;
GL11.glViewport(0, 0, (int) w, (int) h);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45.0f, ratio , 0.1f, 100.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GLU.gluLookAt(eye.x, eye.y, eye.z, target.x, target.y, target.z, up.x, up.y, up.z);
Вместо GLU.gluPerspective
матрица перспективной проекции может быть установлена следующим образом:
float width = ...; // width of the window
float height = ...; // height of the window
float fov_y = 45.0f; // filed of view in degrees (y axis)
float n = 0.1f; // near plane
float f = 100.0f; // far plane
float a = width / height;
float ta = Math.tan(Math.radians(fov_y) / 2.0f);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
glLoadMatrixf(new float[]{
1.0f/(ta*a), 0.0f, 0.0f, 0.0f,
0.0f, 1.0f/ta, 0.0f, 0.0f,
0.0f, 0.0f, -(f+n)/(f-n), -1.0f,
0.0f, 0.0f, -2.0f*f*n/(f-n), 0.0f
});
Вместо использования GLU.gluLookAt
матрицу вида можно установить с помощью glTranslate
и glRoatate
:
float distance = 10.0f; // distance to object
float pitch = 0.0f; // pitch in degrees
float yaw = 0.0f; // yaw in degrees
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f);
GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
GL11.glTranslatef(0.0f, 0.0f, -distance);