Может ли кто-нибудь помочь мне найти правильную формулу для четырехъядерной нормализации?
Используя c ++ с opengl.
Благодарю вас!
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-объект )
v0xv1 + v1xv2 + v2Xv0
. @sisis, по модулю вы получите v0
в последнем члене.
Метод Ньюэлла обычно является лучшим выбором для вычисления нормалей многоугольников, которые почти плоские. Как правило, он достаточно устойчив к мелким дефектам, но при этом не слишком дорог. См. Статья о драгоценных камнях графики . Это похоже на описанное выше:
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) ;
Вероятно, для квадроциклов это не будет иметь большого значения, если они будут вести себя достаточно хорошо, но я бы определенно использовал это, если вы имеете дело с более сложными полигонами.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .