Как сделать камеру? - PullRequest
       65

Как сделать камеру?

2 голосов
/ 24 января 2020

Как мне сделать камеру в моем приложении lwjgl 3D java? Я пытаюсь использовать glRotate и glTranslatef, но это перемещение только объектов, и мне нужно переместить сцену.

То же самое я пытаюсь использовать

glLoadMatrixf(new float[]{
                50, 50, 50, 50,
                50, 50, 50, 50,
                -75, 50, 50, 50,
                100, 100, 100, 100
}); 

Но я не совсем понимаю, как это работает, и я вижу белый экран

Какое утешение я могу использовать для своей задачи?

Ответы [ 2 ]

1 голос
/ 24 января 2020

Если вы хотите создать свою первую матрицу вида, начните с 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);
1 голос
/ 24 января 2020

В OpenGL нет камеры. Чтобы «переместить камеру», вы должны вместо этого переместить объекты в противоположном направлении. Например, вместо перемещения камеры вперед, вы должны переместить объекты назад.

...