Вычисление нормалей для Кэтмулла-Кларка

Я неправильно рассчитываю свои нормали после выполнения итерации Кэтмалла-Кларка. Я не уверен в правильном подходе к исправлению этого.

Прямо сейчас я сначала выполняю свое подразделение, получаю вершины в draw_vertices, а затем вызываю вычисление нормалей для этих draw_vertices.

как определить правильную ориентацию для каждого квадроцикла?

введите здесь описание изображения

введите здесь описание изображения

void calculate_normals() {
        for (int i = 0; i < d(); i+=4) {
            vec3 a = d[i];
            vec3 b = d[i+1];
            vec3 c = d[i+2];
            vec3 d = d[i+3];
            vec3 ba = b - a;
            vec3 ca = c - a;
            vec3 normal1;
            cross(&normal1, &ca, &ba);
            normal1.normalize();
            n.push_back(normal1);
            n.push_back(normal1);
            n.push_back(normal1);
            n.push_back(normal1);

            d[i].print();
            d[i+1].print();
            d[i+2].print();
            d[i+3].print();
            normal1.print();
            normal1.print();
            normal1.print();
            normal1.print();
            printf("\n");
}

person Community    schedule 10.08.2015    source источник


Ответы (1)


Вы вычисляете нормаль каждой грани и назначаете ее для каждой вершины. Поскольку вершины соединены с четырьмя разными гранями, присвоение вершине нормали одной грани не дает правильного ответа. Вы должны вычислить нормаль каждой грани, соединенной с вершиной, и взять среднее значение. Кроме того, если вершины установлены в порядке против часовой стрелки c=b.cross(a)

person Good Luck    schedule 10.08.2015
comment
Vector3f a = (*v1)-›pos; Vector3f b = (*v2)-›pos; Vector3f c = (*v3)-›pos; Vector3f d = (*v4)-›pos; Vector3f нормальный1; Vector3f da = d - a; Vector3f ba = b - a; крест(&normal1, &da, &ba); ... (*v1)-›нормальный = (*v1)-›нормальный + нормальный1; (*v2)-›нормальный = (*v2)-›нормальный + нормальный2; (*v3)-›нормальный = (*v3)-›нормальный + нормальный3; (*v4)-›нормальный = (*v4)-›нормальный + нормальный4; - person ; 11.08.2015
comment
Технически это должно работать. Это концепция нормального расчета затенения Фонга и Гуро. Проверьте это: nbb.cornell.edu/ neurobio/land/OldStudentProjects/cs490-95to96/. В общем, кажется, что некоторые нормали вверх, а некоторые вниз. Попробуйте отрендерить их и убедитесь, что они точны. - person Good Luck; 11.08.2015