OpenGL三角带;似乎没有获得Z坐标以影响绘图

OpenGL三角带;似乎没有获得Z坐标以影响绘图,opengl,gl-triangle-strip,Opengl,Gl Triangle Strip,我尝试使用GL_三角形_条绘制一条线,该条线将随着z坐标变深或变浅,但传递到glVertex3f()的z值似乎不会影响感知的宽度。在下面的代码(OpenGL编程指南中的一个修改示例)中,线条应该从更靠近透视图的地方开始(较大),然后越远(较小) 你能指出我的错误吗,或者是一个关于这个问题的话题吗 void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); } void display(voi

我尝试使用GL_三角形_条绘制一条线,该条线将随着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;
}
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GLU平面);
}
作废显示(作废)
{
GLGRAN=5.0;
gl双倍宽度=7.0;
GLdoubleθ=1.047197551;
GLdouble-halfPi=3.1459/2;
GLdouble refpx=50.0;
GLdouble refpy=50.0;
GLdouble startr=1.0;
GLTg=1.0;
GLTB=0.5;
glClear(GLU颜色缓冲位);
//glLoadIdentity();
//glScalef(2.0,-.5,1.0);
//glRotatef(45.0,0.0,0.0,1.0);
glBegin(GLU三角带);
对于(int i=0;i<40;i++)
{
glColor3f(startr/i,startg/(20-(i%20)),startb);
GLX1=refpx+宽度*cos(θ+半π);
GLdouble x2=refpx+宽度*cos(θ+半π*3);
GLdouble y1=参考Py+宽度*sin(θ+半π);
GLdouble y2=参考Py+宽度*sin(θ+半π*3);
glVertex3f(x1,y1,(GLdouble)i/40.0);
glVertex3f(x2,y2,(GLdouble)i/40.0);
refpx+=gran*cos(θ);
refpy+=gran*sin(θ);
如果(i%9==0){
θ+=半π/8;
}
如果(i==20){
θ-=半π/2;
}
如果(i==5){
θ-=半π/2;
}
}
格伦德();
glDisable(GLU混合);
glFlush();
}
空洞重塑(整数w,整数h)
{
GLVIEW(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_投影);
glLoadIdentity();
glOrtho(0.0,(GLdouble)w,0.0,(GLdouble)h,-1.0,1.0);
glMatrixMode(GLU模型视图);
}
int main(int argc,字符**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(450450);
位置(100100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutMainLoop();
返回0;
}

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

在透视投影中,物体要小得多,而正交投影则不然

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


这就是为什么:它不能改变,因为你在计算X和Y坐标的数学中没有任何东西可以根据距离改变大小。Z本身不会改变屏幕上的大小,除非你在投影矩阵中设置透视变换。使用
gluPerspective
,或者组装你自己的相机矩阵,math在这里:

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

在透视投影中,物体要小得多,而正交投影则不然

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


这就是为什么:它不能改变,因为你在计算X和Y坐标的数学中没有任何东西可以根据距离改变大小。Z本身不会改变屏幕上的大小,除非你在投影矩阵中设置透视变换。使用
gluPerspective
,或者组装你自己的相机矩阵,math在这里:

您是在尝试模拟透视图还是想要实际透视图?如果您想要实际透视图,您必须使用类似
glupperspective()
的东西,而不是
glOrtho()
。嘿,谢谢你的回复!我想模拟透视图,因为我研究这个的原因是为了给一个程序添加功能,这个程序的绘图例程已经用这种方式设置好了。有什么建议吗?你是想模拟透视图还是想要实际透视图?如果你想要实际透视图,你必须使用像
glupspective()
而不是
glOrtho()
。嘿,谢谢你的回答!我想模拟透视图,因为我研究这个的原因是为了给一个程序添加功能,这个程序的绘图例程已经用这种方式设置好了。有什么建议吗?谢谢你的回答!我用透视图状态获得了我需要的功能。这比我想象的要容易得多,我使用GL_TRIANGLE_STRIP绘制了超过10个像素的线条。再次感谢。@balthatrix如果我的答案有帮助,请投票并接受。抱歉花了这么长时间,先生,我真的很感谢你的答案,这正是我所需要的。我还不能投票,因为我还没有15个代表哈哈!谢谢你的answers!我使用gluPerspective state获得了所需的功能。这比我想象的要容易得多,而且我还制作了一些非常简洁的类,用于绘制宽度大于10的图形-