C ++ OpenGL: как найти нормализованные векторы для четырехугольника? - PullRequest
4 голосов
/ 06 апреля 2010

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

с использованием c ++ с opengl.

спасибо!

Ответы [ 2 ]

8 голосов
/ 22 апреля 2010

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

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) ;

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

6 голосов
/ 06 апреля 2010

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

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-объект)

...