Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在OpenGL C+中记住折痕角度的逐顶点加权法线+;_C++_Visual Studio_Opengl_Normals - Fatal编程技术网

C++ 在OpenGL C+中记住折痕角度的逐顶点加权法线+;

C++ 在OpenGL C+中记住折痕角度的逐顶点加权法线+;,c++,visual-studio,opengl,normals,C++,Visual Studio,Opengl,Normals,我试图计算逐顶点加权法线,考虑折痕角度。 但是,由于我的游戏中有很多(>12)个网格对象,所以代码需要花费很长时间才能运行。 tere是否有更好的方法来计算逐顶点加权法线,同时牢记折痕角度 下面是显示它的一段代码: if (cosCreaseAngle == 0) { // ignore crease angle, just average all the nermoals keeping area in mind float area = 0; for (long pos =

我试图计算逐顶点加权法线,考虑折痕角度。 但是,由于我的游戏中有很多(>12)个网格对象,所以代码需要花费很长时间才能运行。 tere是否有更好的方法来计算逐顶点加权法线,同时牢记折痕角度

下面是显示它的一段代码:

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]]);
                }
            }
        }
    }
}
如果(cosCreaseAngle==0){//忽略折痕角度,只需将所有折痕的平均值记在心里即可
浮动面积=0;
对于(长pos=0;posface_index_vertex.size();pos++){
int firstVertex=位置-位置%3;
面积=计算面积(m->dot_顶点[m->face_索引_顶点[firstVertex],m->dot_顶点[m->face_索引_顶点[firstVertex+1],m->dot_顶点[m->face_索引_顶点[firstVertex+2]);
m->dot\u normalPerVertexWeighted[m->face\u index\u vertex[pos]]+=
面积*(m->dot_normalPerFace[m->face_index_normalPerFace[pos]];//乘以面积
}
}
else{//仅当法线之间的角度小于折痕角度时,才平均法线
浮动面积=0;
对于(长pos=0;posface_index_vertex.size();pos++){
m->dot_normalPerVertexWeighted[m->face_index_vertex[pos]=m->dot_normalPerFace[m->face_index_normalPerFace[pos]];
对于(长邻接面=pos+3;邻接面face_index_vertex.size();邻接面++){
如果(m->face\u index\u vertex[pos]==m->face\u index\u vertex[adjacentFace]){
如果(余角<法线之间的夹角(m->dot_normalPerFace[m->face_index_normalPerFace[pos]],m->dot_normalPerFace[m->face_index_normalPerFace[adjacentFace]])){
int firstVertex=邻接面-邻接面%3;
面积=计算面积(m->dot_顶点[m->face_索引_顶点[firstVertex],m->dot_顶点[m->face_索引_顶点[firstVertex+1],m->dot_顶点[m->face_索引_顶点[firstVertex+2]);
m->dot\u normalPerVertexWeighted[m->face\u index\u vertex[pos]]+=
面积*(m->dot_normalPerFace[m->face_index_normalPerFace[adjacentFace]]);
}
}
}
}
}

您的代码有一个嵌套循环,它会导致二次运行时间。您应该构建一个邻接图——为每个顶点将相邻面添加到列表中,然后遍历该图。这将把运行时间缩短到线性