Как правильно настроить проекцию усеченного конуса? - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь создать проекцию усеченного конуса, чтобы я мог правильно просматривать трехмерные объекты и перемещаться по трехмерному пространству.Я знаю, что конусообразная форма создается в 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 Ответ

3 голосов
/ 24 апреля 2019

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

Что именно работают рядом сClClipPlane и farClipPlane?

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

Как управлять положением и точкой, на которую указывает камера?

В OpenGL вы не меняете положение камеры, а трансформируете всю сцену(модель-матрица) в обратном направлении.Например, если вы хотите установить положение камеры на 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, потому что вам нужно преобразовать всю сцену в обратном направлении, чтобы получить эффект, похожий на то, что камера движется.

...