Как мне правильно настроить мою усеченную проекцию?

#java #lwjgl

#java #lwjgl

Вопрос:

Я пытаюсь создать усеченную проекцию, чтобы я мог правильно просматривать 3D-объекты и перемещаться по 3D-пространству. Я знаю, что форма типа конуса создается при 0,0,0, и вы можете указать, в каком направлении она движется, но есть несколько вещей, которые я не понимаю:

Что именно делать nearClipPlane и farClipPlane работать? Почему конус должен быть дальше?

Как мне контролировать положение и куда указывает камера?

Я видел, как люди создавали усечения, используя только 1s и -1s, правильно ли это?

Мой код:

 glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(windowWidth / 2, windowWidth / 2, windowHeight / 2, windowHeight / 2, 0, -50);
glMatrixMode(GL_MODELVIEW);

while (!glfwWindowShouldClose(window)) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //draw

    glfwSwapBuffers(window);
    glfwPollEvents();
}
  

Ответ №1:

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

Что именно работают nearClipPlane и farClipPlane?

введите описание изображения здесь Объекты, которые находятся перед ближней плоскостью отсечения или в задней части дальней плоскости отсечения, не будут отображаться. Вы не должны передавать отрицательные значения в glFrustum() для ближней и дальней плоскостей, общие значения равны 0,1 для ближней плоскости и 100-1000 для расстояния в дальней плоскости.

Как мне контролировать положение и куда указывает камера?

В OpenGL вы не меняете положение камеры, но вы преобразуете всю сцену (modelview-матрицу) в обратном направлении. Например, если вы хотите установить положение вашей камеры на 10, 0, 5 и повернуть камеру на 45 градусов вокруг оси y, вы должны использовать

 glMatrixMode(GL_MODELVIEW);
/*
If you wouldn't generate a new identity matrix every frame, you would **add** the rotation/translation to the previous one, which obviously isn't what you want
*/
glLoadIdentity();
Vector3f cameraPosititon = new Vector3f(10, 0, 5);    

/*
rotate selected matrix about 45 degrees around y
With the 1 as third argument you select that you want to rotate over the y-axis.
If you would pass 1 as 2nd or 4th argument, you would rotate over the x or the z axis.*/
glRotatef(45, 0, 1, 0);
//translate selected matrix about x, y, z
glTranslatef(-1 * cameraPosition.x, -1 * cameraPosition.y, -1 * cameraPosition.z);
  

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

Комментарии:

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

2. Нет, это другое. Это означает, что вы можете видеть что угодно между двумя плоскостями.

3. Если это так, почему люди обычно размещают клип ближней плоскости далеко от камеры?