Фрагмент кода C # для вычисления нормалей поверхности и вершин - PullRequest
0 голосов
/ 27 ноября 2009

Мне нужен фрагмент кода C # для вычисления нормалей поверхности и вершин. Вид поверхности - триангулированная трехмерная замкнутая сетка. Требуемый фрагмент кода должен иметь возможность использовать набор вершин и треугольники. Они готовы к использованию в данный момент. Поверхность трехмерного сетчатого объекта не является гладкой, поэтому ее необходимо сгладить.

Не могли бы вы помочь мне.

1 Ответ

5 голосов
/ 29 ноября 2009

Звучит так, как будто вы пытаетесь отобразить трехмерную сетку и применить эффект плавного затенения путем интерполяции нормалей поверхности, например, в Затенение Фонга , и вам необходимо сначала вычислить нормали. Это отличается от сглаживания поверхности самой сетки, поскольку подразумевает изменение положения ее вершин.

Нормы поверхности можно рассчитать путем получения векторного перекрестного произведения двух ребер треугольника.

Что касается кода, я не знаю ни одного примера 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 () .

Обратите внимание, что это вычисляет нормаль поверхности для одного треугольника. Поскольку вы не предоставляете никакой информации о том, как хранятся ваши вершины и индексы, я предоставлю вам возможность получить набор треугольников, которые необходимо передать этой функции.

РЕДАКТИРОВАТЬ : Как дополнительное примечание, я думаю, что "направление намотки" ваших треугольников является значительным. Намотка в неправильном направлении приведет к тому, что нормаль будет также указывать в противоположном направлении.

...