游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1436|回复: 0

请教 关于20面体顶点法向量的问题~~请高手帮忙~~~

[复制链接]

4

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-11-20 12:17:00 | 显示全部楼层 |阅读模式
我这个是按着红宝书里面关于20面的代码做的 但是貌似是顶点法向量的定义 有问题 所以出来的图片 棱角不分明 看不清楚  请高手指点一下小妹~~~[em6]


#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[0]][j] - vdata[tindices[1]][j];   
                                        d2[j] = vdata[tindices[1]][j] - vdata[tindices[2]][j];   
                                }
                                normcrossprod(d1, d2, norm);
                                glNormal3fv(norm);       

                                //glColor3f(0,1, 0);
                                glNormal3fv(&vdata[tindices[0]][0]);
                                glVertex3fv(&vdata[tindices[0]][0]);
                                //glColor3f(1,0, 0);
                                glNormal3fv(&vdata[tindices[1]][0]);
                                glVertex3fv(&vdata[tindices[1]][0]);
                                //glColor3f(0,0, 1);   
                                glNormal3fv(&vdata[tindices[2]][0]);
                                glVertex3fv(&vdata[tindices[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;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-19 04:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表