我编写了以下函数来绘制立方体:
void drawCube() {
Point vertices[8] = { Point(-1.0, -1.0, -1.0), Point(-1.0, -1.0, 1.0), Point(1.0, -1.0, 1.0), Point(1.0, -1.0, -1.0),
Point(-1.0, 1.0, -1.0), Point(-1.0, 1.0, 1.0), Point(1.0, 1.0, 1.0), Point(1.0, 1.0, -1.0) };
int faces[6][4] = {{0, 1, 2, 3}, {0, 3, 7, 4}, {0, 1, 5, 4}, {1, 2, 6, 5}, {3, 2, 6, 7}, {4, 5, 6, 7}};
glBegin(GL_QUADS);
for (unsigned int face = 0; face < 6; face++) {
Vector v = vertices[faces[face][1]] - vertices[faces[face][0]];
Vector w = vertices[faces[face][2]] - vertices[faces[face][0]];
Vector normal = v.cross(w).normalised();
glNormal3f(normal.dx, normal.dy, normal.dz);
for (unsigned int vertex = 0; vertex < 4; vertex++) {
switch (vertex) {
case 0: glTexCoord2f(0, 0); break;
case 1: glTexCoord2f(1, 0); break;
case 2: glTexCoord2f(1, 1); break;
case 3: glTexCoord2f(0, 1); break;
}
glVertex3f(vertices[faces[face][vertex]].x, vertices[faces[face][vertex]].y, vertices[faces[face][vertex]].z);
}
}
glEnd();
}
当立方体被照射到它上面的光渲染时,看起来当我旋转立方体时,正确的阴影过渡只发生在大约一半的面上。剩下的只是一个非常黑暗的阴影,好像我已经删除了正常的计算。
然后我决定删除几个面以查看立方体内部。在外部没有正确反射光线的面部正在内侧正确地进行。如何确保每张脸的法线指向该脸部,而不是指向立方体的中心?
答案 0 :(得分:1)
要反转正常方向,请交换用于交叉产品的订单:
{{1}}
答案 1 :(得分:0)
也许有一种更有效的方式,但以下是一种非常容易理解的方式....
计算从侧面中心指向立方体中心的矢量。叫它
m = center cube - center side
然后用您的法线计算该向量的标量积:
x = < m , n >
如果两个矢量指向相对于侧面的相同方向(它们之间的角度小于90度),则标量积为正。如果它们指向相反方向(角度大于90度)则为负。然后纠正你的正常通过
if ( x > 0 ) n = -n;
确保它总是向外指出。