【发布时间】:2015-03-22 17:41:13
【问题描述】:
如您所见,我的白墙上有照明问题:
以下是我用来制作一面墙的代码,我用这些代码来制作整个建筑。我只是为更简单的坐标制作了一个立方体,添加了法线,然后根据我想要使用它的位置以两种可能的方式对其进行缩放。这是代码
private static void wallUnit(GLAutoDrawable glAutoDrawable, int param) {
GL2 gl2 = glAutoDrawable.getGL().getGL2();
gl2.glBindTexture(gl2.GL_TEXTURE_2D, 1);
if (param == 0)
gl2.glScalef(0.5f, 3f, 6f); // side wall
else
gl2.glScalef(6f, 3f, 0.5f); // front/ back walls
gl2.glBegin(gl2.GL_QUADS);
// Back face
gl2.glNormal3f(0.0f, 0.0f, -1.0f); // quad normal
gl2.glTexCoord2f(0.0f, 0.0f);
gl2.glVertex3f(-1.0f, -1.0f, -1.0f);
gl2.glTexCoord2f(2.0f, 0.0f);
gl2.glVertex3f(1.0f, -1.0f, -1.0f);
gl2.glTexCoord2f(2.0f, 2.0f);
gl2.glVertex3f(1.0f, 1f, -1.0f);
gl2.glTexCoord2f(0.0f, 2.0f);
gl2.glVertex3f(-1.0f, 1f, -1.0f);
// Bottom face
gl2.glNormal3f(1.0f, 0.0f, 0.0f); // quad normal
gl2.glTexCoord2f(0.0f, 0.0f);
gl2.glVertex3f(-1.0f, -1.0f, -1.0f);
gl2.glTexCoord2f(2.0f, 0.0f);
gl2.glVertex3f(1.0f, -1.0f, -1.0f);
gl2.glTexCoord2f(2.0f, 2.0f);
gl2.glVertex3f(1.0f, -1.0f, 1.0f);
gl2.glTexCoord2f(0.0f, 2.0f);
gl2.glVertex3f(-1.0f, -1.0f, 1.0f);
// Right side
gl2.glNormal3f(0.0f, -1.0f, 0.0f); // quad normal
gl2.glTexCoord2f(0.0f, 0.0f);
gl2.glVertex3f(1.0f, -1.0f, -1.0f);
gl2.glTexCoord2f(2.0f, 0.0f);
gl2.glVertex3f(1.0f, -1.0f, 1.0f);
gl2.glTexCoord2f(2.0f, 2.0f);
gl2.glVertex3f(1.0f, 1.0f, 1.0f);
gl2.glTexCoord2f(0.0f, 2.0f);
gl2.glVertex3f(1.0f, 1f, -1.0f);
// Top face
gl2.glNormal3f(-1.0f, 0.0f, 0.0f); // quad normal
gl2.glTexCoord2f(0.0f, 0.0f);
gl2.glVertex3f(1.0f, 1.0f, 1.0f);
gl2.glTexCoord2f(2.0f, 0.0f);
gl2.glVertex3f(1.0f, 1f, -1.0f);
gl2.glTexCoord2f(2.0f, 2.0f);
gl2.glVertex3f(-1.0f, 1f, -1.0f);
gl2.glTexCoord2f(0.0f, 2.0f);
gl2.glVertex3f(-1.0f, 1f, 1.0f);
// Left side
gl2.glNormal3f(0.0f, 1.0f, 0.0f); // quad normal
gl2.glTexCoord2f(0.0f, 0.0f);
gl2.glVertex3f(-1.0f, -1.0f, -1.0f);
gl2.glTexCoord2f(2.0f, 0.0f);
gl2.glVertex3f(-1.0f, -1.0f, 1.0f);
gl2.glTexCoord2f(2.0f, 2.0f);
gl2.glVertex3f(-1.0f, 1.0f, 1.0f);
gl2.glTexCoord2f(0.0f, 2.0f);
gl2.glVertex3f(-1.0f, 1f, -1.0f);
// Front face
gl2.glNormal3f(0.0f, 0.0f, 1.0f); // quad normal
gl2.glTexCoord2f(0.0f, 0.0f);
gl2.glVertex3f(-1.0f, -1.0f, 1.0f);
gl2.glTexCoord2f(2.0f, 0.0f);
gl2.glVertex3f(1.0f, -1.0f, 1.0f);
gl2.glTexCoord2f(2.0f, 2.0f);
gl2.glVertex3f(1.0f, 1f, 1.0f);
gl2.glTexCoord2f(0.0f, 2.0f);
gl2.glVertex3f(-1.0f, 1f, 1.0f);
gl2.glEnd();
}
现在您可以看到存在一个问题,即相邻的两块墙具有相同的法线,因此应该是相同的颜色,对吧?但相反,墙的一部分只是更暗。出了什么问题?
【问题讨论】:
-
您可以尝试在设置代码中添加
glEnable(GL_RESCALE_NORMAL)吗?由于您进行了缩放转换,因此您的法线将与位置一起缩放。 -
太棒了,这正是我所需要的。我不知道规范也会得到扩展。