Как придать 2D структуре глубину 3D - PullRequest
0 голосов
/ 09 февраля 2011

Я прошу изучать OpenGL как часть проекта молекулярного моделирования, и в настоящее время я пытаюсь визуализировать 7 спиралей, которые будут размещены пространственно близко друг к другу и будут определенным образом перемещаться, наклоняться и взаимодействовать друг с другом.Мой вопрос заключается в том, как придать 2D-сцене трехмерную глубину, чтобы геометрические структуры выглядели как настоящие спирали в трех измерениях?

Я попытался поиграться с матрицами проекций (gulPerspective, glFrustum) без особой удачи, а также с помощью функции glDepthRange.

Я включил свой код для рендеринга спиралей, но для простоты явставьте код для рендеринга одной спирали (остальные 6 спиралей точно такие же, за исключением их матрицы преобразования и параметров цветовой функции) и для изменения формы при отображении из координат объекта в координаты клипа:

Любая помощь будет многооценили.

void init() {

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);    // Black background
    glLineWidth(8.0);

}

/* CALLED TO DRAW THE HELICES */ 

void RenderHelix() {

    GLfloat x,y,z; 
    GLfloat c = 2.5f;   //helical pitch 
    GLfloat theta;      //constant angle between tangent and x-axis 
    GLfloat r = 4.5f;   //radius 
    //GLint i = 1;      //loop through code to render 7 helices 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

/* GREEN HELIX */ 

    glBegin(GL_LINE_STRIP); 
    glColor3f(0.0, 1.0, 0.0);           
    for(theta = 0; theta <= 360; ++theta) { 
        x = r*(cos(theta));
        y = r*(sin(theta));
        z = c*theta; 
        glVertex3f(x,y,z);
    }
    glEnd();
    glLoadIdentity(); 
    glScalef(1.0,1.0,12.0); 
    glTranslatef(50.0, 100.0, 0.0);  //Move Position 
    glRotatef(90.0, 0.0, 0.0, 0.0);

/* Other 6 helices .... */

glFlush(); 
 glutSwapBuffers();

}

void Reshape(GLint w, GLint h) {

    if(h==0)
        h=1;

    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLfloat aspectratio = (GLfloat)w/(GLfloat)h;
    if(w<=h)
        glOrtho(-100,100,-100/aspectratio,100/aspectratio, -100,310);
    else
        glOrtho(-100*aspectratio,100*aspectratio,-100,100,-100,310);

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();       
}

1 Ответ

0 голосов
/ 09 февраля 2011

Я отредактировал ваш код и поместил комментарий тут и там:

void init() {
    /* One time OpenGL initialization would be textures and
     * other static stuff. Nothing like that here */    
}

/* CALLED TO DRAW THE HELICES */ 

void RenderHelix() {

    GLfloat x,y,z; 
    float aspectratio;
    GLfloat c = 2.5f;   //helical pitch 
    GLfloat theta;      //constant angle between tangent and x-axis 
    GLfloat r = 4.5f;   //radius 
    //GLint i = 1;      //loop through code to render 7 helices 

    /* assuming w and h are globals or somehow else accessible */
    aspectratio = (float)w/(float)h;
    glViewport(0,0,w,h);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);    // Black background
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLfloat aspectratio = (GLfloat)w/(GLfloat)h;
    if(w<=h)
        glFrustum(-10.f,10.f, -10.f/aspectratio, 10.f/aspectratio, 1.0f, 10.f);
    else
        glFrustum(-10.f*aspectratio,10.f*aspectratio,-10.f,10.f, 1.0f,10.f);

/* enable depth testing, also make sure the right depth func is used */
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);


/* GREEN HELIX */ 
    glLineWidth(8.0);    

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity();

    glTranslatef(0.f, 0.f, -4.5f);

    glPushMatrix();
    /* this helix will be drawn in the center, as it's not moved anywhere. */

    glBegin(GL_LINE_STRIP); 
    glColor3f(0.0, 1.0, 0.0);
    /* trigonometric functions take radians, not degrees */
    for(theta = 0; theta <= M_PI2; theta += M_PI2*0.01;) { 
        /* instead of calculating the helices a new each rendering
         * pass you should store them to a vertex array. */
        x = r*cosf(theta);
        y = r*sinf(theta);
        z = c*theta; 
        glVertex3f(x,y,z);
    }
    glEnd();

    glPopMatrix();

/* Other 6 helices .... */
    glScalef(1.0,1.0,12.0); 
    glTranslatef(50.0, 100.0, 0.0);  //Move Position of next helix, you may want to use glPushMatrix/glPopMatrix
    glRotatef(90.0, 0.0, 0.0, 0.0);  // a null rotation, what's that's supposed to do?


glFlush(); // redundant, glFlush is implied by SwapBuffers
 glutSwapBuffers();

}

void Reshape(GLint w, GLint h) {
    /* Pleast don't set OpenGL stuff in the window reshape handler.
     * This just causes confusion, as soon one uses multiple projections
     * in a single rendering */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...