我要发帖 回复

正式会员

5

主题

27

积分

0

专家分

:

私信
发表时间 : 2009-11-19 16:18:26 | 浏览 : 2078    评论 : 4
以下是我按着红宝书,但是出来的效果 看不清棱角, 我觉得应该是是顶点法向量的问题  请高手帮忙指点一下哈~~
#define X .525731112119133606*5
#define Z .850650808352039932*5
int i,j;

void normalize(float v[3]) {   
        GLfloat d= sqrt(v[0]*v[1]+v[1]*v[1]+v[2]*v[2]);
        if (d == 0.0) {
                return;
        }
        v[0] /= d; v[1] /= d; v[2] /= d;
}

void normcrossprod(float v1[3], float v2[3], float out[3])
{
        out[0] = v1[1]*v2[2] - v1[2]*v2[1];
        out[1] = v1[2]*v2[0] - v1[0]*v2[2];
        out[2] = v1[0]*v2[1] - v1[1]*v2[0];
        normalize(out);
}
void display()

{
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glLoadIdentity();
        gluLookAt(6.0,6.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
       
        static GLfloat vdata[12][3] = {   
                {-X, 0.0, Z}, {X, 0.0, Z}, {-X, 0.0, -Z}, {X, 0.0, -Z},   
                {0.0, Z, X}, {0.0, Z, -X}, {0.0, -Z, X}, {0.0, -Z, -X},   
                {Z, X, 0.0}, {-Z, X, 0.0}, {Z, -X, 0.0}, {-Z, -X, 0.0} };

                static GLint tindices[20][3] = {
                        {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},   
                        {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},   
                        {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},
                        {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} };
               
                        glEnableClientState(GL_VERTEX_ARRAY);
                        glVertexPointer(3, GL_FLOAT, 0,&vdata);

                        glBegin(GL_TRIANGLES);

                        for (i = 0; i < 20; i++) {  

                                GLfloat d1[3], d2[3], norm[3];   
                                for (j = 0; j < 3; j++) {   
                                        d1[j] = vdata[tindices[i][0]][j] - vdata[tindices[i][1]][j];   
                                        d2[j] = vdata[tindices[i][1]][j] - vdata[tindices[i][2]][j];   
                                }
                                normcrossprod(d1, d2, norm);
                                glNormal3fv(norm);       

                                //glColor3f(0,1, 0);
                                glNormal3fv(&vdata[tindices[i][0]][0]);
                                glVertex3fv(&vdata[tindices[i][0]][0]);
                                //glColor3f(1,0, 0);
                                glNormal3fv(&vdata[tindices[i][1]][0]);
                                glVertex3fv(&vdata[tindices[i][1]][0]);
                                //glColor3f(0,0, 1);   
                                glNormal3fv(&vdata[tindices[i][2]][0]);
                                glVertex3fv(&vdata[tindices[i][2]][0]);          

                        }

                        glEnd();
                        glFlush();

}
void init(void)
{
        glClearColor(0.0, 0.0, 0.0, 0.0);
        //glShadeModel (GL_FLAT);
        GLfloat ambient[] = {0.5, 0.5, 0.5, 1.0};
        GLfloat position[] = {0.0, 0.0, 2.0, 1.0};
        GLfloat mat_diffuse[] = {1.0, 1.0, 1.0, 1.0};
        GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
        GLfloat mat_shininess[] = {50.0};

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

        glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
        glLightfv(GL_LIGHT0, GL_POSITION, position);

        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
}


void reshape(int w, int h)
{
        glViewport(0, 0, (GLsizei) w, (GLsizei) h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum( -1.0, 1.0, -1.0, 1.0, 1.5, 20.0);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}

void keyboard(unsigned char key, int x, int y)
{
        switch (key) {
          case 27:
                  exit(0);
                  break;
        }
}

int main(int argc, char **argv)
{
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize (500, 500);
        glutInitWindowPosition (100, 100);
        glutCreateWindow(argv[0]);
        init();
        glutReshapeFunc(reshape);
        glutDisplayFunc(display);
        glutKeyboardFunc(keyboard);
        glutMainLoop();
        return 0;
}

最近VR访客

tan_dunming 评论于2009-11-19 16:41:53
没有开启Z测试 所以看到的图像有问题

下面是截图
Normal.jpg
下面是我修改的代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <gl\freeglut.h>
  4. #include <math.h>

  5. #define X .525731112119133606*5
  6. #define Z .850650808352039932*5
  7. int i,j;

  8. void normalize(float v[3]) {   
  9.         GLfloat d= sqrt(v[0]*v[1]+v[1]*v[1]+v[2]*v[2]);
  10.         if (d == 0.0) {
  11.                 return;
  12.         }
  13.         v[0] /= d; v[1] /= d; v[2] /= d;
  14. }

  15. void normcrossprod(float v1[3], float v2[3], float out[3])
  16. {
  17.         out[0] = v1[1]*v2[2] - v1[2]*v2[1];
  18.         out[1] = v1[2]*v2[0] - v1[0]*v2[2];
  19.         out[2] = v1[0]*v2[1] - v1[1]*v2[0];
  20.         normalize(out);
  21. }
  22. void display()

  23. {
  24.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  25.         glClearColor(0.0, 0.0, 0.0, 0.0);
  26.         glLoadIdentity();
  27.         gluLookAt(6.0,6.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
  28.       
  29.                 static float angle = 0.0f;
  30.                 glRotatef(angle++, 1, 1, 1);
  31.                 if(angle > 360.0f)
  32.                         angle = 0.0f;
  33.         static GLfloat vdata[12][3] = {   
  34.                 {-X, 0.0, Z}, {X, 0.0, Z}, {-X, 0.0, -Z}, {X, 0.0, -Z},   
  35.                 {0.0, Z, X}, {0.0, Z, -X}, {0.0, -Z, X}, {0.0, -Z, -X},   
  36.                 {Z, X, 0.0}, {-Z, X, 0.0}, {Z, -X, 0.0}, {-Z, -X, 0.0} };

  37.                 static GLint tindices[20][3] = {
  38.                         {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},   
  39.                         {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},   
  40.                         {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},
  41.                         {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} };
  42.                
  43.                         glEnableClientState(GL_VERTEX_ARRAY);
  44.                         glVertexPointer(3, GL_FLOAT, 0,&vdata);

  45.                         glBegin(GL_TRIANGLES);

  46.                         for (i = 0; i < 20; i++) {  

  47.                                 GLfloat d1[3], d2[3], norm[3];   
  48.                                 for (j = 0; j < 3; j++) {   
  49.                                         d1[j] = vdata[tindices[i][0]][j] - vdata[tindices[i][1]][j];   
  50.                                         d2[j] = vdata[tindices[i][1]][j] - vdata[tindices[i][2]][j];   
  51.                                 }
  52.                                 normcrossprod(d1, d2, norm);
  53.                                 glNormal3fv(norm);      

  54.                                 //glColor3f(0,1, 0);
  55.                                 glNormal3fv(&vdata[tindices[i][0]][0]);
  56.                                 glVertex3fv(&vdata[tindices[i][0]][0]);
  57.                                 //glColor3f(1,0, 0);
  58.                                 glNormal3fv(&vdata[tindices[i][1]][0]);
  59.                                 glVertex3fv(&vdata[tindices[i][1]][0]);
  60.                                 //glColor3f(0,0, 1);   
  61.                                 glNormal3fv(&vdata[tindices[i][2]][0]);
  62.                                 glVertex3fv(&vdata[tindices[i][2]][0]);         

  63.                         }

  64.                         glEnd();
  65.                         glFlush();
  66.                                                 glutSwapBuffers();
  67.                                                 Sleep(30);
  68.                                                 glutPostRedisplay();


  69. }
  70. void init(void)
  71. {
  72.         glClearColor(0.0, 0.0, 0.0, 0.0);
  73.         //glShadeModel (GL_FLAT);
  74.         GLfloat ambient[] = {0.5, 0.5, 0.5, 1.0};
  75.         GLfloat position[] = {0.0, 0.0, 2.0, 1.0};
  76.         GLfloat mat_diffuse[] = {1.0, 1.0, 1.0, 1.0};
  77.         GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
  78.         GLfloat mat_shininess[] = {50.0};

  79.                 glEnable(GL_DEPTH_TEST);


  80.         glEnable(GL_LIGHTING);
  81.         glEnable(GL_LIGHT0);
  82.         glEnable(GL_COLOR_MATERIAL);
  83.         glEnable(GL_AUTO_NORMAL);
  84.         glEnable(GL_NORMALIZE);

  85.         glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  86.         glLightfv(GL_LIGHT0, GL_POSITION, position);

  87.         glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  88.         glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  89.         glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
  90. }


  91. void reshape(int w, int h)
  92. {
  93.         glViewport(0, 0, (GLsizei) w, (GLsizei) h);
  94.         glMatrixMode(GL_PROJECTION);
  95.         glLoadIdentity();
  96.         glFrustum( -1.0, 1.0, -1.0, 1.0, 1.5, 20.0);

  97.         glMatrixMode(GL_MODELVIEW);
  98.         glLoadIdentity();
  99. }

  100. void keyboard(unsigned char key, int x, int y)
  101. {
  102.         switch (key) {
  103.           case 27:
  104.                   exit(0);
  105.                   break;
  106.         }
  107. }

  108. int main(int argc, char **argv)
  109. {
  110.         glutInit(&argc, argv);
  111.         glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  112.         glutInitWindowSize (500, 500);
  113.         glutInitWindowPosition (100, 100);
  114.         glutCreateWindow(argv[0]);
  115.         init();
  116.         glutReshapeFunc(reshape);
  117.         glutDisplayFunc(display);
  118.         glutKeyboardFunc(keyboard);
  119.         glutMainLoop();
  120.         return 0;
  121. }
复制代码
追求卓越
jsz60000 评论于2009-11-20 12:11:54
2# tan_dunming

谢谢你的解答。。但是按着你的代码  出来的图像的棱角还是看不清楚诶。。
应该是显示下面的这种棱角分明的20面体的~~ 未命名.jpg
tan_dunming 评论于2009-11-20 14:57:27
终于明白你的意思了 稍微修改了一下代码
Normal.jpg

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <gl\freeglut.h>
  4. #include <math.h>

  5. #define X .525731112119133606*5
  6. #define Z .850650808352039932*5
  7. int i,j;

  8. void normalize(float v[3]) {   
  9.         GLfloat d= sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
  10.         if (d == 0.0) {
  11.                 return;
  12.         }
  13.         v[0] /= d; v[1] /= d; v[2] /= d;
  14. }

  15. void normcrossprod(float v1[3], float v2[3], float out[3])
  16. {
  17.         out[0] = v1[1]*v2[2] - v1[2]*v2[1];
  18.         out[1] = v1[2]*v2[0] - v1[0]*v2[2];
  19.         out[2] = v1[0]*v2[1] - v1[1]*v2[0];
  20.         normalize(out);
  21. }
  22. void display()

  23. {
  24.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  25.         glClearColor(0.0, 0.0, 0.0, 0.0);
  26.         glLoadIdentity();
  27.         gluLookAt(6.0,6.0,10.0,0.0,0.0,0.0,0.0,1.0,0.0);
  28.       
  29.                 static float angle = 0.0f;
  30.                 glRotatef(angle++, 1, 1, 0);
  31.                 if(angle > 360.0f)
  32.                         angle = 0.0f;
  33.         static GLfloat vdata[12][3] = {   
  34.                 {-X, 0.0, Z}, {X, 0.0, Z}, {-X, 0.0, -Z}, {X, 0.0, -Z},   
  35.                 {0.0, Z, X}, {0.0, Z, -X}, {0.0, -Z, X}, {0.0, -Z, -X},   
  36.                 {Z, X, 0.0}, {-Z, X, 0.0}, {Z, -X, 0.0}, {-Z, -X, 0.0} };

  37.                 static GLint tindices[20][3] = {
  38.                         {0,4,1}, {0,9,4}, {9,5,4}, {4,5,8}, {4,8,1},   
  39.                         {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},   
  40.                         {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},
  41.                         {6,1,10}, {9,0,11}, {9,11,2}, {9,2,5}, {7,2,11} };
  42.                

  43.                         glBegin(GL_TRIANGLES);

  44.                         for (i = 0; i < 20; i++) {
  45.                                 GLfloat d1[3], d2[3], norm[3];   
  46.                                 for (j = 0; j < 3; j++) {   
  47.                                         d1[j] = vdata[tindices[i][0]][j] - vdata[tindices[i][1]][j];   
  48.                                         d2[j] = vdata[tindices[i][1]][j] - vdata[tindices[i][2]][j];   
  49.                                 }
  50.                                 normcrossprod(d1, d2, norm);
  51.                                 glNormal3fv(norm);   

  52.                                 glColor3f(0,0.4, 0);

  53.                                 glVertex3fv(&vdata[tindices[i][0]][0]);
  54.                                 glVertex3fv(&vdata[tindices[i][1]][0]);
  55.                                 glVertex3fv(&vdata[tindices[i][2]][0]);         

  56.                         }

  57.                         glEnd();
  58.                         glFlush();
  59.                                                 glutSwapBuffers();
  60.                                                 Sleep(30);
  61.                                                 glutPostRedisplay();


  62. }
  63. void init(void)
  64. {
  65.         glClearColor(0.0, 0.0, 0.0, 0.0);
  66.         GLfloat ambient[] = {0.5, 0.5, 0.5, 1.0};
  67.         GLfloat position[] = {0.0, 0.0, 2.0, 1.0};
  68.                 glEnable(GL_DEPTH_TEST);
  69.         glEnable(GL_LIGHTING);
  70.         glEnable(GL_LIGHT0);
  71.         glEnable(GL_COLOR_MATERIAL);


  72.         glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  73.         glLightfv(GL_LIGHT0, GL_POSITION, position);
  74.                
  75.                 glEnable(GL_CULL_FACE);
  76. }


  77. void reshape(int w, int h)
  78. {
  79.         glViewport(0, 0, (GLsizei) w, (GLsizei) h);
  80.         glMatrixMode(GL_PROJECTION);
  81.         glLoadIdentity();
  82.         glFrustum( -1.0, 1.0, -1.0, 1.0, 1.0, 20.0);

  83.         glMatrixMode(GL_MODELVIEW);
  84.         glLoadIdentity();
  85. }

  86. void keyboard(unsigned char key, int x, int y)
  87. {
  88.         switch (key) {
  89.           case 27:
  90.                   exit(0);
  91.                   break;
  92.         }
  93. }

  94. int main(int argc, char **argv)
  95. {
  96.         glutInit(&argc, argv);
  97.         glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  98.         glutInitWindowSize (500, 500);
  99.         glutInitWindowPosition (100, 100);
  100.         glutCreateWindow(argv[0]);
  101.         init();
  102.         glutReshapeFunc(reshape);
  103.         glutDisplayFunc(display);
  104.         glutKeyboardFunc(keyboard);
  105.         glutMainLoop();
  106.         return 0;
  107. }
复制代码
追求卓越
jsz60000 评论于2009-11-23 10:06:05
4# tan_dunming
谢谢你的解答~~~ 我发现我的代码光照调节的不好。。换成你代码的颜色 就出来棱角分明的图像了 哈哈   你得代码可以转诶~~  我是初学啦~~以后要向前辈们多多学习~~

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-5-13 11:36 AM

返回顶部