我编写了一个简单的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,否则将不指定行为,并取决于库的内部实现。