Может ли кто-нибудь помочь мне найти правильную формулу для четырехъядерной нормализации?

Используя c ++ с opengl.

Благодарю вас!

4
ufk 6 Апр 2010 в 06:38
3
Вы хотите нормализовать вектор или хотите вычислить вектор нормали к плоскости?
 – 
James McNellis
6 Апр 2010 в 06:42

2 ответа

Лучший ответ

Предполагая, что вам нужен нормальный вектор для четырехугольника, этот псевдокод работает

Vector3d vertex[4] = { ... }
Vector3d normal(0,0,0) ;

for (int i=0; i<4; i++)
{
    normal += cross (vertex[i], vertex[(i+1)%4]) ; // cross product
}
normalize (normal) ;
// normal is the unit normal to the quad

Это дает вам формулу n=A/|A|, где A = v0xv1 + v1xv2 + v2xv3 + v3xv0 и vi=vertex[i]). |A|/2 - это также площадь многоугольника. Это можно обобщить на произвольные многоугольники и даже дать разумные результаты для неплоских многоугольников, если они не слишком неплоские.

Одна ссылка - http://softsurfer.com/Archive/algorithm_0101/algorithm_0101.htm

Если вы знаете, что четырехугольник / многоугольник плоский, вам нужно только вычислить нормаль треугольника, образованного первыми тремя вершинами. Это A1/|A1|, где A1 = (v1-v0)x(v2-v0) = v0xv1 + v1xv2 + v2xv0.

Если под «четверной нормализацией» вы имели в виду что-то еще, просто проигнорируйте этот ответ.

РЕДАКТИРОВАТЬ: я нашел этот связанный вопрос: Получить площадь поверхности многогранника (3D-объект )

6
Community 23 Май 2017 в 13:29
3
Не следует ли вычесть 2 вершины, чтобы получить вектор? Для нормалей нецелесообразно использовать перекрестное произведение точек.
 – 
cobbal
6 Апр 2010 в 06:55
Почему цикл for и почему по модулю?
 – 
sisis
6 Апр 2010 в 06:59
@cobbal, вы можете сделать это с помощью векторов ребер, таких как (v_1 - v_0) x (v_2 - v_0), но как только вы его упростите, получится что-то вроде v0xv1 + v1xv2 + v2Xv0. @sisis, по модулю вы получите v0 в последнем члене.
 – 
brainjam
6 Апр 2010 в 07:07
Я загружаю файлы dxf, созданные из четырехугольников, и рисую их на экране, я хочу найти их нормали, чтобы у меня было правильное освещение
 – 
ufk
6 Апр 2010 в 16:51
Вам не хватает символа "]" в "normal + = cross (vertex [i], vertex [(i + 1)% 4);" Я думаю, это должно быть «нормально + = крест (вершина [i], вершина [(i + 1)% 4])»; ...?
 – 
andand
9 Апр 2010 в 17:39

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

Vector3d normal(0,0,0) ;

for (int i=0; i<4; i++)
{
    int j = (i+1)%4;
    normal.x += (vertex[i].y - vertex[j].y)
               *(vertex[i].z + vertex[j].z);
    normal.y += (vertex[i].z - vertex[j].z)
               *(vertex[i].x + vertex[j].x);
    normal.z += (vertex[i].x - vertex[j].x)
               *(vertex[i].y + vertex[j].y);
}
normalize (normal) ;

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

8
MPG 22 Апр 2010 в 16:58