Ниже приведен поверхностный нормальный вопрос для треугольной сетки:
float3 calcNormal( float3 p0 , float3 p1 , float3 p2 ){
float3 V = { p1.x - p0.x , p1.y - p0.y , p1.z - p0.z };
float3 U = { p2.x - p0.x , p2.y - p0.y , p2.z - p0.z };
float3 normal = {V.y * U.z - U.y*V.z , V.x * U.z - U.x * V.z , V.x * U.y - U.x * V.y };
return normal;
}
Нормальная функция треугольника ↑
glNormal3f(calcNormal( { i*size , heightMap[i][j]*h , j*size } , {(i+1)*size, heightMap[i+1][j]*h,j*size } , { i*size,heightMap[i][j+1]*h,j*size } ).x ,
calcNormal( { i*size , heightMap[i][j]*h , j*size } , {(i+1)*size, heightMap[i+1][j]*h,j*size } , { i*size,heightMap[i][j+1]*h,j*size } ).y,
calcNormal( { i*size , heightMap[i][j]*h , j*size } , {(i+1)*size, heightMap[i+1][j]*h,j*size } , { i*size,heightMap[i][j+1]*h,j*size } ).z);
С кодом выше я вычисляю нормаль 1-го треугольника из 2 треугольниковв одном квадрате и нижеприведенном я вычисляю нормаль 2-го треугольника (я полагаю).
glNormal3f(calcNormal( { (i+1)*size , heightMap[i+1][j]*h , j*size } , {(i)*size, heightMap[i][j+1]*h,(j+1)*size } , { (i+1)*size,heightMap[i+1][j+1]*h,(j+1)*size } ).x ,
calcNormal( { (i+1)*size , heightMap[i+1][j]*h , j*size } , {(i)*size, heightMap[i][j+1]*h,(j+1)*size } , { (i+1)*size,heightMap[i+1][j+1]*h,(j+1)*size } ).y,
calcNormal( { (i+1)*size , heightMap[i+1][j]*h , j*size } , {(i)*size, heightMap[i][j+1]*h,(j+1)*size } , { (i+1)*size,heightMap[i+1][j+1]*h,(j+1)*size } ).z);
Возможно ли использовать нормали треугольника вместо нормалей вершин в этом случае ниже, еслиИтак, как мне сделать нормальные звонки?
...
glBegin(GL_TRIANGLE_STRIP);
...
glNormal3f(/*calculated normal*/); //I know these are supposed to be vertex normals
glColor3f(0,color_map ,color_ugate-color_map );
glVertex3f(i*size , heightMap[i][j]*h , j*size);
glNormal3f(/*calculated normal*/);
glColor3f(0,color_map ,color_ugate-color_map );
glVertex3f((i+1)*size , heightMap[i+1][j]*h , j*size);
glNormal3f(/*calculated normal*/);
glColor3f(0,color_map ,color_ugate-color_map );
glVertex3f(i*size , heightMap[i][j+1]*h , (j+1)*size);
glNormal3f(/*calculated normal*/);
glColor3f(0,color_map ,color_ugate-color_map );
glVertex3f((i+1)*size , heightMap[i+1][j+1]*h , (j+1)*size);
...
glEnd();
...