我的問題是關於OpenGL和法線,我理解他們背後的數學,並且我取得了一些成功。OpenGL計算法線(四邊形)
我在下面附加的函數接受交錯的頂點數組,並計算每4個頂點的法線。這些代表QUADS具有相同的方向。根據我的理解,這4個頂點應該共享相同的Normal。只要他們面對同樣的道路。
我遇到的問題是我的QUADS渲染時有一個對角線漸變,非常像這樣:Light Effect - 除了陰影在中間,角落中的燈光。
我以一致的方式畫出我的QUADS。 TopLeft,TopRight,BottomRight,BottomLeft和我用來計算法線的頂點是TopRight - TopLeft和BottomRight - TopLeft。
希望有人可以看到我犯了一個錯誤的東西,但我已經在這幾個小時沒有佔上風。
爲了記錄我呈現了一個立方體和一個茶壺旁邊的我的對象來檢查我的照明功能,所以我相當確定沒有關於光位置的問題。
void CalculateNormals(point8 toCalc[], int toCalcLength)
{
GLfloat N[3], U[3], V[3];//N will be our final calculated normal, U and V will be the subjects of cross-product
float length;
for (int i = 0; i < toCalcLength; i+=4) //Starting with every first corner QUAD vertice
{
U[0] = toCalc[i+1][5] - toCalc[i][5]; U[1] = toCalc[i+1][6] - toCalc[i][6]; U[2] = toCalc[i+1][7] - toCalc[i][7]; //Calculate Ux Uy Uz
V[0] = toCalc[i+3][5] - toCalc[i][5]; V[1] = toCalc[i+3][6] - toCalc[i][6]; V[2] = toCalc[i+3][7] - toCalc[i][7]; //Calculate Vx Vy Vz
N[0] = (U[1]*V[2]) - (U[2] * V[1]);
N[1] = (U[2]*V[0]) - (U[0] * V[2]);
N[2] = (U[0]*V[1]) - (U[1] * V[0]);
//Calculate length for normalising
length = (float)sqrt((pow(N[0],2)) + (pow(N[1],2)) + (pow(N[2],2)));
for (int a = 0; a < 3; a++)
{
N[a]/=length;
}
for (int j = 0; i < 4; i++)
{
//Apply normals to QUAD vertices (3,4,5 index position of normals in interleaved array)
toCalc[i+j][3] = N[0]; toCalc[i+j][4] = N[1]; toCalc[i+j][5] = N[2];
}
}
}
這是C++;你有沒有考慮過使用數學庫,比如[GLM](http://glm.g-truc.net/)? – 2012-01-17 16:24:20
不幸的是,這是一個任務,因此我們不鼓勵使用庫。 – LBHoward 2012-01-17 16:38:58