我编写了一个简单的OpenGL代码,它在visual Studio中正常工作。
但当它被移到Xcode时。这是一个成功的编译,但结果不同。什么都没有。
我只更改了OpenGL,GLUT头文件。
我怀疑Xcode中gluPerspective的范围不同,但我不知道确切的原因。
如何操作?
这是我的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();
}

最佳答案

到近平面的距离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

如果aHomogeneous coordinates被这样的矩阵转换,那么结果的z分量将始终等于w分量。
Perspective divide之后,归一化设备坐标的z分量为1,与坐标无关。
这意味着几何的所有顶点坐标都被“投影”到相同的深度,所有的几何形状都有1的最大深度。
因为zNear必须大于0.0,否则将不指定行为,并取决于库的内部实现。

10-02 19:34