Звучит так, как будто вы пытаетесь отобразить трехмерную сетку и применить эффект плавного затенения путем интерполяции нормалей поверхности, например, в Затенение Фонга , и вам необходимо сначала вычислить нормали. Это отличается от сглаживания поверхности самой сетки, поскольку подразумевает изменение положения ее вершин.
Нормы поверхности можно рассчитать путем получения векторного перекрестного произведения двух ребер треугольника.
Что касается кода, я не знаю ни одного примера C #, но вот один в C ++, который легко портировать. Это взято из популярных NeHe обучающих программ для OpenGL :
void calcNormal(float v[3][3], float out[3]) // Calculates Normal For A Quad Using 3 Points
{
float v1[3],v2[3]; // Vector 1 (x,y,z) & Vector 2 (x,y,z)
static const int x = 0; // Define X Coord
static const int y = 1; // Define Y Coord
static const int z = 2; // Define Z Coord
// Finds The Vector Between 2 Points By Subtracting
// The x,y,z Coordinates From One Point To Another.
// Calculate The Vector From Point 1 To Point 0
v1[x] = v[0][x] - v[1][x]; // Vector 1.x=Vertex[0].x-Vertex[1].x
v1[y] = v[0][y] - v[1][y]; // Vector 1.y=Vertex[0].y-Vertex[1].y
v1[z] = v[0][z] - v[1][z]; // Vector 1.z=Vertex[0].y-Vertex[1].z
// Calculate The Vector From Point 2 To Point 1
v2[x] = v[1][x] - v[2][x]; // Vector 2.x=Vertex[0].x-Vertex[1].x
v2[y] = v[1][y] - v[2][y]; // Vector 2.y=Vertex[0].y-Vertex[1].y
v2[z] = v[1][z] - v[2][z]; // Vector 2.z=Vertex[0].z-Vertex[1].z
// Compute The Cross Product To Give Us A Surface Normal
out[x] = v1[y]*v2[z] - v1[z]*v2[y]; // Cross Product For Y - Z
out[y] = v1[z]*v2[x] - v1[x]*v2[z]; // Cross Product For X - Z
out[z] = v1[x]*v2[y] - v1[y]*v2[x]; // Cross Product For X - Y
ReduceToUnit(out); // Normalize The Vectors
}
Там же можно найти функцию нормализации ReduceToUnit () .
Обратите внимание, что это вычисляет нормаль поверхности для одного треугольника. Поскольку вы не предоставляете никакой информации о том, как хранятся ваши вершины и индексы, я предоставлю вам возможность получить набор треугольников, которые необходимо передать этой функции.
РЕДАКТИРОВАТЬ : Как дополнительное примечание, я думаю, что "направление намотки" ваших треугольников является значительным. Намотка в неправильном направлении приведет к тому, что нормаль будет также указывать в противоположном направлении.