0
주름 각을 고려하여 정점 별 가중치 법선을 계산하려고합니다. 그러나 게임에 많은 (> 12) 메쉬 개체가있어 코드가 실행되는 데 영원히 걸립니다. 주름 각을 염두에두고 버텍스 가중치 법선을 계산하는 더 좋은 방법이 있습니까?OpenGL C++의 주름 각을 염두에두고 정점 별 가중치를 계산합니다.
if (cosCreaseAngle == 0) { // ignore crease angle, just average all the nermoals keeping area in mind
float area = 0;
for (long pos = 0; pos < m->face_index_vertex.size(); pos++) {
int firstVertex = pos - pos % 3;
area = calcTriangleArea(m->dot_vertex[m->face_index_vertex[firstVertex]], m->dot_vertex[m->face_index_vertex[firstVertex + 1]], m->dot_vertex[m->face_index_vertex[firstVertex + 2]]);
m->dot_normalPerVertexWeighted[m->face_index_vertex[pos]] +=
area*(m->dot_normalPerFace[m->face_index_normalPerFace[pos]]); // multiply by the area
}
}
else { //average the normals only when the angle between normals is less than the crease angle
float area = 0;
for (long pos = 0; pos < m->face_index_vertex.size(); pos++) {
m->dot_normalPerVertexWeighted[m->face_index_vertex[pos]] = m->dot_normalPerFace[m->face_index_normalPerFace[pos]];
for (long adjacentFace = pos + 3; adjacentFace < m->face_index_vertex.size(); adjacentFace++) {
if (m->face_index_vertex[pos] == m->face_index_vertex[adjacentFace]) {
if (cosCreaseAngle < calcAngleBetweenNormals(m->dot_normalPerFace[m->face_index_normalPerFace[pos]], m->dot_normalPerFace[m->face_index_normalPerFace[adjacentFace]])) {
int firstVertex = adjacentFace - adjacentFace % 3;
area = calcTriangleArea(m->dot_vertex[m->face_index_vertex[firstVertex]], m->dot_vertex[m->face_index_vertex[firstVertex + 1]], m->dot_vertex[m->face_index_vertex[firstVertex + 2]]);
m->dot_normalPerVertexWeighted[m->face_index_vertex[pos]] +=
area*(m->dot_normalPerFace[m->face_index_normalPerFace[adjacentFace]]);
}
}
}
}
}