Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Расчет нормалей к граням куба


Автор: Rijndael 5.11.2007, 17:03
Переделал пример из "справочника..."
Код

// GLUT.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <gl\glut.h>

GLfloat spin = 0.0;

#define X 80.0
GLfloat coords[8][3] = {
    {-X,-X,X},{X,-X,X},{X,X,X},{-X,X,X},
    {-X,-X,-X},{X,-X,-X},{X,X,-X},{-X,X,-X}
};

GLbyte indices[6][4] = {
    {0,1,2,3},{5,6,2,1},
    {5,4,7,6},{0,4,5,1},
    {4,0,3,7},{7,3,2,6}
};

void init(void)
{
    GLfloat mat_specular[]={1.0,1.0,1.0,1.0};
    GLfloat mat_shininess[]={50.0};
    GLfloat light_position[]={0.5,0.5,0.5,0.0};
    GLfloat white_light[]={0.99,0.99,0.99,0.0};

    glClearColor(1.0,1.0,1.0,0.0);
    glColor3f(0.8,0.0,0.0);
    glShadeModel(GL_SMOOTH);

    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
    glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
    glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);
    glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);

    glEnable(GL_NORMALIZE);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);

    //glPolygonMode(GL_FRONT,GL_LINE);
    glEnable(GL_CULL_FACE);
}

void draw(float *v1, float *v2, float *v3, float *v4)
{
    glBegin(GL_QUADS);
            glNormal3fv(v1);
            glVertex3fv(v1);
            glNormal3fv(v2);
            glVertex3fv(v2);
            glNormal3fv(v3);
            glVertex3fv(v3);
            glNormal3fv(v4);
            glVertex3fv(v4);
    glEnd();
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    glRotatef(spin,0.5,0.0,0.0);

    glBegin(GL_QUADS);
        for(int i=0; i<6; i++)
        {
            draw(&coords[indices[i][0]][0],
                &coords[indices[i][1]][0],
                &coords[indices[i][2]][0],
                &coords[indices[i][3]][0]);
        }
    glEnd();

    glPopMatrix();
    glutSwapBuffers();
}

void rotate()
{
    spin += 0.01;
    if (spin > 360) spin -= 360;
    glutPostRedisplay();
}

void reshape(int w,int h)
{
    glViewport(0,0,(GLsizei) w, (GLsizei) h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w<=h)
        glOrtho(-200.0,200.0,-200.0*(GLfloat)h/(GLfloat)w,200.0*(GLfloat)h/(GLfloat)w,-200.0,200.0);
    else
        glOrtho(-200.0*(GLfloat)w/(GLfloat)h,200.0*(GLfloat)w/(GLfloat)h,-200.0,200.0,-200.0,200.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

int main(int argc, char **argv)
{    
    FreeConsole();
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
    glutInitWindowSize(400,400);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Line Stipple Patterns");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(rotate);
    glutMainLoop();
    return 0;
}


В общем, все нормально, но в результате на гранях куба получаются непонятные "ребра", разделяющие грань на светлый/темный треугольники...
user posted image

Вопросы:
1. Почему возникают эти линии?
2. Уместно ли в данном случае применение ф-ии glEnable(GL_NORMALIZE);? smile

Автор: Rijndael 5.11.2007, 20:12
Разобрался.

Автор: Rickert 6.11.2007, 10:34
Обычно говорят в чём проблема была, так на будущее-  вдруг у кого-то похожая проблема встанет ребром smile 

Автор: DigitSphinx 8.11.2007, 20:57
да кстати !

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)