Как найти нормаль сложной формы (более 4 вершин) и применить к ней освещение? - PullRequest
0 голосов
/ 14 марта 2012

Я сейчас пытаюсь применить освещение к сложной фигуре, нарисованной с флагом GL_TRIANGLE_STRIP. поскольку каждая плоскость в XYZ может быть определена тремя точками, вычисление нормали может быть довольно простым, но что произойдет, когда я использую gl_triangle_strip?

Чтобы сделать следующий код более читабельным, процесс рисования выглядит следующим образом:
(x, y) -> (x + 1, y) -> (x, y + 1) -> (x + 1, y + 1)

for(int i = 0; i < m_GraphConfig.MAXY   ; i +=2)
{
    glBegin(GL_TRIANGLE_STRIP);
    for (int j = 0; j < m_GraphConfig.MAXX  ;j+=2)
    {
        if ( (i * m_GraphConfig.MAXX + j + 2) % (m_GraphConfig.MAXX) != 0 && (i+2) % (m_GraphConfig.MAXY) != 0  && (j + 2) % (m_GraphConfig.MAXX) != 0  )
        {
            index = i * (m_GraphConfig.MAXX) + j;
            heightVal = host[index];
            glColor3b(((heightVal % 32) * 7 %255), ((heightVal % 16) * 14) %255, ((heightVal % 128) * 2)%255);
            glTexCoord2f(0.0f, 0.0f);   
            glVertex3d(xFactor * j , host[index] /m_GraphConfig.devider  , zFactor * i);

            index = i * (m_GraphConfig.MAXX) + j + 2;
            heightVal = host[index];
            glColor3b(((heightVal % 32) * 7)%255, ((heightVal % 16) * 14)%255, ((heightVal % 128) * 2)%255);
            glTexCoord2f(1.0f, 0.0f);   
            glVertex3d(xFactor * (j + 2) , host[index] / m_GraphConfig.devider, zFactor * i);

            index = i * (m_GraphConfig.MAXX) + j + (2 * m_GraphConfig.MAXX);
            heightVal = host[index];
            glColor3b(((heightVal % 32) * 7)%255, ((heightVal % 16) * 14)%255, ((heightVal % 128) * 2)%255);
            glTexCoord2f(0.0f, 1.0f);   
            glVertex3d(xFactor * j , host[index] / m_GraphConfig.devider , zFactor * (i + 2));

            index = i * (m_GraphConfig.MAXX) + j + (2 * m_GraphConfig.MAXX) + 2;
            heightVal = host[index];
            glColor3b(((heightVal % 32) * 7)%255, ((heightVal % 16) * 14)%255, ((heightVal % 128) * 2)%255);
            glTexCoord2f(1.0f, 1.0f);   
            glVertex3d(xFactor * ( j + 2) , host[index] / m_GraphConfig.devider , zFactor * (i + 2));           
        }
    }
    glEnd();
    glBindTexture( GL_TEXTURE_2D, 0 ); //clear the texture buffer
}

1 Ответ

0 голосов
/ 14 марта 2012

Это зависит от вашего использования.Является ли это плоской поверхностью (например, дном цилиндра) или пышной формой (например, стороной цилиндра)

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

Во втором случае вам нужно разделить полосу треугольника на треугольники и обработать / визуализировать их по отдельности.Если вы хотите сохранить полосу сглаживания и треугольника, вам нужно будет рассчитать и использовать нормали для каждой вершины (средние значения всех нормалей треугольников, использующих эту вершину)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...