1

私はopenglでシーンを照らしていますが、壁は4つあり、そのうち2つだけが照らされています。法線がおかしいと思いますが、よくわかりません。

これは照明コードです:

glShadeModel(GL_SMOOTH);
//glEnable(GL_CULL_FACE);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);

GLfloat lightpos0[] = {-5, 1, 0, 0.};
GLfloat AmbientLight0[] = {0.2, 0.2, 0.2,1.0}; 
GLfloat DiffuseLight0[] = {0.8, 0.8, 0.8,1.0};
GLfloat SpecularLight0[] = {1.0, 1.0, 1.0,1.0};

glLightfv(GL_LIGHT0, GL_POSITION, lightpos0);
glLightfv(GL_LIGHT0, GL_AMBIENT, AmbientLight0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseLight0);
glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularLight0);

GLfloat lightpos1[] = {5, 1, 0, 0};
GLfloat AmbientLight1[] = {0.2, 0.2, 0.2,1.0}; 
GLfloat DiffuseLight1[] = {0.8, 0.8, 0.8,1.0};
GLfloat SpecularLight1[] = {1.0, 1.0, 1.0,1.0};

glLightfv(GL_LIGHT1, GL_POSITION, lightpos1);
glLightfv(GL_LIGHT1, GL_AMBIENT, AmbientLight1);
glLightfv(GL_LIGHT1, GL_DIFFUSE, DiffuseLight1);
glLightfv(GL_LIGHT1, GL_SPECULAR, SpecularLight1);

これは、4つの壁を描画するためのコードです。

    //north
    glBegin(GL_QUADS);
glNormal3f(1.0,0,0);
glVertex3f(-10,0,-10);
glVertex3f( 10,0,-10);
glVertex3f( 10,5,-10);
glVertex3f(-10,5,-10);
glEnd();
//south
glBegin(GL_QUADS);
glNormal3f(-1.0, 0, 0);
glVertex3f(-10,0, 10);
glVertex3f( 10,0, 10);
glVertex3f( 10,5, 10);
glVertex3f(-10,5, 10);
glEnd();
//east
glBegin(GL_QUADS);
glNormal3f(0,0, -1.0);
glVertex3f( 10,0,-10);
glVertex3f( 10,0,10);
glVertex3f( 10,5,10);
glVertex3f( 10,5,-10);
glEnd();
//west
glBegin(GL_QUADS);
glNormal3f(0,0,1.0);
glVertex3f( -10,0,-10);
glVertex3f( -10,0,10);
glVertex3f( -10,5,10);
glVertex3f( -10,5,-10);
glEnd();

それが役に立ったら、ここに何が起こっているのかの画像があります:http: //i.stack.imgur.com/xRgVL.png

4

2 に答える 2

2

Vladislav Khorevが指摘しているように、法線はすべての点に共通の座標から外れるように指示する必要があります(この特別な直交配置を前提としています)。しかし、ポリゴンの巻き方も考慮する必要があります。

 // Polygon A --  north     Polygon B -- south
 glVertex3f(-10,0,-10);     glVertex3f(-10,0, 10); 
 glVertex3f( 10,0,-10);     glVertex3f( 10,0, 10);
 glVertex3f( 10,5,-10);     glVertex3f( 10,5, 10);
 glVertex3f(-10,5,-10);     glVertex3f(-10,5, 10);
 Normal(0,0,1),             Normal(0,0,-1);

2つのポリゴン(北と南)は、曲がりくねっています。1つ目はCCWのポイント0,0,0ともう1つから観測されたClockWiseです。これらと一致している必要があります。

于 2013-02-08T06:08:43.790 に答える
1

間違った法線ベクトルを壁に渡したようです。

壁がすべての点でZ=-10になった場合(壁はXに平行)、法線ベクトルはZの正の方向に向けられている必要があります:(0,0,1)。同じことがすべての方向に当てはまります。

これを試して:

glBegin(GL_QUADS);
glNormal3f(0,0,1);
glVertex3f(-10,0,-10);
glVertex3f( 10,0,-10);
glVertex3f( 10,5,-10);
glVertex3f(-10,5,-10);
glEnd();
//south
glBegin(GL_QUADS);
glNormal3f(0, 0, -1);
glVertex3f(-10,0, 10);
glVertex3f( 10,0, 10);
glVertex3f( 10,5, 10);
glVertex3f(-10,5, 10);
glEnd();
//east
glBegin(GL_QUADS);
glNormal3f(-1,0, -0);
glVertex3f( 10,0,-10);
glVertex3f( 10,0,10);
glVertex3f( 10,5,10);
glVertex3f( 10,5,-10);
glEnd();
//west
glBegin(GL_QUADS);
glNormal3f(1, 0, 0);
glVertex3f( -10,0,-10);
glVertex3f( -10,0,10);
glVertex3f( -10,5,10);
glVertex3f( -10,5,-10);
glEnd();
于 2013-02-08T06:02:25.163 に答える