【问题标题】:Need help with Converting Points to Shapes在将点转换为形状方面需要帮助
【发布时间】:2009-03-24 17:35:47
【问题描述】:

以下是我从 NEHE Pr​​oduction(第 25 课)复制的完整代码。 我只是想玩,但似乎无法将每个点更改/转换为单独的球体或圆柱体。不知何故,当我进行调整时,它们并没有按照他们设想的方式排列,他们赢了' t 旋转..
我计划稍后在本教程中添加灯光..

提前感谢您的帮助 =]

int InitGL(GLvoid)
{
    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0);
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    maxver=0;
    objload("data/sphere.txt",&morph1);
    objload("data/torus.txt",&morph2);
    objload("data/Tube.txt",&morph3);

    objallocate(&morph4,10300);

    for(int i=0;i<10300;i++)
    {
        morph4.points[i].x=((float)(rand()%14000)/1000)-7;
        morph4.points[i].y=((float)(rand()%14000)/1000)-7;
        morph4.points[i].z=((float)(rand()%14000)/1000)-7;
    }

    objload("data/Tube.txt",&helper);
    sour=dest=&morph1;

    return TRUE;
}

void DrawGLScene(GLvoid)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(cx,cy,cz);
    glRotatef(xrot,1,0,0);
    glRotatef(yrot,0,1,0);
    glRotatef(zrot,0,0,1);

    xrot+=xspeed; yrot+=yspeed; zrot+=zspeed;

    GLfloat tx,ty,tz;
    VERTEX q;
    glPointSize(2.0f);

    //glBegin(GL_POINTS);
    for(int i=0;i<morph3.verts;i++)
    {
        if(morph) 
            q=calculate(i); 
        else 
            q.x=q.y=q.z=0;

        helper.points[i].x-=q.x;
        helper.points[i].y-=q.y;
        helper.points[i].z-=q.z;
        tx=helper.points[i].x;
        ty=helper.points[i].y;
        tz=helper.points[i].z;

        glColor3f(0,1,1);
        glPushMatrix(); //i have modified this part onwards
        gltranslaste(tx,ty,tz);
        glutSolidSphere(2,6,6);
        glPopMatrix();

        /*glVertex3f(tx,ty,tz);
        glColor3f(0,0.5f,1);
        tx-=2*q.x; ty-=2*q.y; ty-=2*q.y;
        glVertex3f(tx,ty,tz);
        glColor3f(0,0,1);
        tx-=2*q.x; ty-=2*q.y; ty-=2*q.y;
        glVertex3f(tx,ty,tz);*/
    }
    //glEnd();

    if(morph && step<=steps)
        step++; 
    else 
    { 
        morph=FALSE; sour=dest; step=0;
    }
}

【问题讨论】:

  • 您应该编辑您的问题并将所有代码缩进另外 4 个空格...这样整个代码将正确显示在一个块中。
  • 正则表达式为黄金的地方 replace(";\s\s+")
  • 为@LFSR 比我愿意付出的更多的工作鼓掌!
  • 感谢帮助编辑 =] 但我仍然无法解决我的问题..

标签: opengl draw points


【解决方案1】:

一个好的起点是将 glBegin(GL_POINTS) 替换为 glBegin(GL_TRIANGLES) 或 GL_QUADS 或 GL_POLYGONS。

请参阅 glBegin/End here 上的帮助页面。

【讨论】:

    【解决方案2】:

    这看起来像tutorial code,完好无损。或者更重要的是,我没有看到任何代码试图绘制球体或圆柱体。你尝试了什么?它是怎么出错的?

    如果您正在寻找指针,我建议您首先隔离绘制点的代码。尝试编写一个函数,根据参数中的属性绘制一个点。

    (请注意,您也应该将 glBegin()-glEnd() 对移动到函数内部。在绘制每个点之前调用 glBegin(),在绘制每个点之后调用 glEnd(),即作为第一行和最后一行。这是因为当你最终从内部调用 gluSphere() 时,你必须摆脱它们。在 glBegin()-glEnd() 对之间没有多少 GL 函数可以调用。)

    根据问题的编辑进行编辑:

    您的代码有效。用glTranslatef 替换gltranslaste,显然,它能够绘制青色形状而不是普通的点。当然,这些形状看起来很丑,一点也不像球体,但它们就在那里,甚至“变形”。有什么问题?

    您可能想要使用材质和照明选项以使它们看起来更好。 (或者只是分配一个纹理,以便您可以看到它们的对齐方式。)至于旋转它们,您应该能够在推入和弹出 [MV] 矩阵之间调用glRotate()

    【讨论】:

    • aib,我现在已经包含代码,请告诉我哪里出错了。 gl, glu, glui, glut 和 glaux 的球体类型太多了,我很困惑哪一个最容易使用..
    • 我认为你最好先使用多边形,正如@Ricket 下面所建议的那样。但我看不出 glutSolidSphere() 有什么问题,它用一行代码绘制了一个球体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2019-12-23
    • 2021-11-06
    相关资源
    最近更新 更多