Нужна помощь с преобразованием точек в фигуры - PullRequest
2 голосов
/ 24 марта 2009

ниже - полная длина кода, который я скопировал из NEHE Production (Урок 25). я просто пытался поиграть, но, похоже, не смог изменить / преобразовать каждое очко в отдельные сферы или цилиндр ...
каким-то образом, когда я выполнил настройку, они не устроены так, как они должны, и они выиграли ' т повернуть ..
я планировал добавить свет в этом уроке позже ..

заранее спасибо за любую помощь =]

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

Ответы [ 2 ]

1 голос
/ 24 марта 2009

Хорошее начало - заменить glBegin (GL_POINTS) на glBegin (GL_TRIANGLES), GL_QUADS или GL_POLYGONS.

См. Страницу справки на glBegin / End здесь .

0 голосов
/ 24 марта 2009

Это похоже на учебный код , без изменений. Или, что более важно, я не вижу кода, пытающегося нарисовать сферы или цилиндры. Что ты пробовал? Как это пошло не так?

Если вы ищете указатели, я предлагаю вам начать с выделения кода, который рисует точки. Попробуйте написать функцию, которая рисует точку с учетом ее свойств в параметрах.

(Обратите внимание, что вы должны переместить пару glBegin () - glEnd () также внутрь функции. Пусть она вызывает glBegin () before и glEnd () после прорисовки каждой точки, то есть в качестве первой и последней линий). Это потому, что вам придется избавиться от них, когда вы в конце концов вызовете gluSphere () изнутри. Между парой glBegin () - glEnd () не так много функций GL.)

Изменить в ответ на редактирование вопроса:

Ваш код работает. Заменив gltranslaste на glTranslatef, очевидно, он способен рисовать голубые фигуры вместо простых точек. Конечно, формы выглядят некрасиво и не похожи на сферы, но они есть, и они даже «превращаются» В чем проблема?

Возможно, вы захотите поиграть с материалами и вариантами освещения, чтобы они выглядели лучше. (Или просто назначьте текстуру, чтобы вы могли видеть их выравнивание.) Что касается их поворота, вы сможете вызывать glRotate() между нажатием и выталкиванием матрицы [MV].

...