我试图使用GL_TRIANGLE_STRIP绘制一条线,该坐标将更深或更浅的z坐标,但是传入glVertex3f()的z值似乎并不是影响感知宽度。在下面的代码中(来自OpenGL编程指南的修改示例),该行应该从透视图(更大)开始,并且越远(越小)。
你会指出我的错误,还是一个解决这个问题的话题?
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void display(void)
{
GLdouble gran = 5.0;
GLdouble width = 7.0;
GLdouble theta = 1.047197551;
GLdouble halfPi = 3.1459/2;
GLdouble refpx = 50.0;
GLdouble refpy = 50.0;
GLdouble startr = 1.0;
GLdouble startg = 1.0;
GLdouble startb = .5;
glClear(GL_COLOR_BUFFER_BIT);
//glLoadIdentity();
//glScalef(2.0, -.5,1.0);
//glRotatef(45.0, 0.0, 0.0, 1.0);
glBegin(GL_TRIANGLE_STRIP);
for(int i = 0; i < 40; i++)
{
glColor3f(startr / i, startg / (20 - (i%20)), startb);
GLdouble x1 = refpx + width*cos(theta + halfPi);
GLdouble x2 = refpx + width*cos(theta + halfPi*3);
GLdouble y1 = refpy + width*sin(theta + halfPi);
GLdouble y2 = refpy + width*sin(theta + halfPi*3);
glVertex3f(x1,y1, (GLdouble)i/40.0);
glVertex3f(x2,y2, (GLdouble)i/40.0);
refpx += gran*cos(theta);
refpy += gran*sin(theta);
if(i % 9 == 0) {
theta += halfPi/8;
}
if(i == 20) {
theta -= halfPi/2;
}
if(i == 5) {
theta -= halfPi/2;
}
}
glEnd();
glDisable(GL_BLEND);
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, (GLdouble) w, 0.0, (GLdouble) h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(450, 450);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
答案 0 :(得分:1)
您正在将投影矩阵设置为正交视图。这意味着距离相机的距离变化不会影响屏幕上对象的大小。
在透视投影远处,事物较小,但对于正交投影则不然。
因此,在顶点计算中,Z坐标由i控制,而不是由X和Y控制,它们仅由三角函数控制,特别是在refpx
和refpy
变化时, XY平面中对象的大小永远不会(因为唯一的变化是添加到refpx
和refpy
值的sin或余弦术语。)
所以这就是原因:它不能改变,因为你在计算X和Y坐标的数学中没有任何东西可以改变距离。除非在投影矩阵中设置透视变换,否则它自身Z对屏幕上的大小没有影响。使用gluPerspective
轻松,或组装自己的相机矩阵,数学在这里:http://en.wikipedia.org/wiki/3D_projection#Perspective_projection