OpenGL GL_TRIANGLE_STRIP;似乎没有得到影响绘图的Z坐标



我正试图使用GL_TRIANGLE_STRIP绘制一条线,该线将随着z坐标而变深或变浅,但我传递到glVertex3f()中的z值似乎不会影响感知宽度。在下面的代码中(OpenGL Programming Guide中的一个修改示例),这行应该从更靠近透视图的地方开始(更大),然后越来越远(更小)。

你能指出我的错误吗,或者指出一个解决这个问题的话题吗?

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;
}

您正在将投影矩阵设置为正交视图。这意味着与相机距离的变化不会影响屏幕上对象的大小。

在透视投影中,东西要小得多,而正交投影则不然。

因此,在顶点计算中,Z坐标由i控制,而不是X和Y,它们仅由三角法控制,特别是,当refpxrefpy发生变化时,XY平面中对象的大小从未发生变化(因为唯一的变化是添加到refpxrefpy值上的正弦或余弦项)。

这就是为什么:它不会改变,因为在计算X和Y坐标的数学中,没有任何东西会随着距离的变化而改变大小。除非在投影矩阵中设置透视变换,否则Z本身不会对屏幕上的大小产生任何影响。为了方便使用gluPerspective,或者组装自己的相机矩阵,数学公式如下:http://en.wikipedia.org/wiki/3D_projection#Perspective_projection

相关内容

  • 没有找到相关文章

最新更新