1

我写了一个简单的 OpenGL 代码,它在 Visual Studio 中正常工作。但是当它被转移到 Xcode 时。这是编译成功,但结果不同。什么都没有。

我只更改了 OpenGL、GLUT 头文件。

我怀疑gluPerspectiveXcode 中的范围不同,但我不知道确切的原因。

它是如何运作的?

这是我在 xcode 中的代码

#include <GLUT/GLUT.h>
#include <OpenGL/OpenGL.h>
#include <OpenGL/glu.h>
#include <math.h>
#include <stdio.h>

double RotAngle = 0.0;  
void OctPyramid(void)
{
    int N = 8;
    double angle = 2 * 3.1415 / N;
    int i;
    glBegin(GL_LINE_LOOP);
    for (i = 0; i < N; i++)
        glVertex3f(cos(i * angle), -1.0, sin(i * angle));
    glEnd();
    glBegin(GL_LINES);
    for (i = 0; i < N; i++)
    {
        glVertex3f(0.0, 1.0, 0.0);
        glVertex3f(cos(i * angle), -1.0, sin(i * angle));
    }
    glEnd();
}
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0.0, 0.0, -6.0);
    glRotatef(RotAngle, 0, 1, 0);
    glTranslatef(2.0, 0.0, 0.0);

    OctPyramid();

    glFlush();
}


void IncAngle(void)
{
    RotAngle = RotAngle + 0.08;
    if (RotAngle > 360.0)
        RotAngle = RotAngle - 360.0;
    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);

    glutInitWindowPosition(0, 0);
    glutInitWindowSize(400, 400);
    glutInitDisplayMode(GLUT_RGBA);
    glutCreateWindow("main");
    glClearColor(0.0, 0.0, 0.0, 1.0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1.0, 0.0, 10.0);


    glutDisplayFunc(display);

    glutIdleFunc(IncAngle);
    glutMainLoop();
}
4

1 回答 1

3

到近平面zNear的距离和到远平面的距离zFar必须大于 0:

设置zNear大于0.0

gluPerspective(45, 1.0, 0.0, 10.0);
gluPerspective(45, 1.0, 0.1, 10.0);

注意,gluPerspective设置一个投影矩阵,如下所示:

ta = tan(fovy / 2)
a  = aspect
n  = zNear
f  = zFar

x:    1/(ta*a)  0     0              0
y:    0         1/ta  0              0
z:    0         0    -(f+n)/(f-n)   -1
t:    0         0    -2*f*n/(f-n)    0

如果zNear = 0这导致:

x:    1/(ta*a)  0     0    0
y:    0         1/ta  0    0
z:    0         0    -1   -1
t:    0         0     0    0

如果通过这样的矩阵变换齐次坐标z,则结果的分量将始终等于该w分量。
Perspective 除法之后,归一化设备坐标的z分量为 1,与坐标无关。
这意味着几何体的所有顶点坐标都“投影”到相同的深度,所有几何体的最大深度为 1.0。
因为它zNear必须大于 0.0,否则行为未指定,取决于库的内部实现。

于 2019-06-14T12:57:25.403 回答