我有存儲數據這樣一個OBJ文件:OBJ文件 - 平均法線
v value1 value2 value3
f value1 value2 value3
首先我計算一個正常的臉,然後分配給該人臉的每個頂點:
for(int i = 0; i < verticesInd.size(); i+=3)
{
glm::vec3 normal = glm::normalize(glm::cross(glm::vec3(vertices[verticesInd[i + 1]]) - glm::vec3(vertices[verticesInd[i]]), glm::vec3(vertices[verticesInd[i + 2]]) - glm::vec3(vertices[verticesInd[i]])));
out_Normals[i] = normal;
out_Normals[i + 1] = normal;
out_Normals[i + 2] = normal;
}
對於實現的平面遮蔽我可以複製頂點:
for(int i = 0; i < verticesInd.size(); i++)
{
out_Vertices.push_back(vertices[verticesInd[i]]);
}
並且使用glDrawArrays繪製對象:
glDrawArrays(GL_TRIANGLES, 0, out_Vertices.size());
爲了獲得平滑的陰影,我需要爲每個頂點平均法線,但我不知道如何找到相鄰的面。
EDIT1:我沒有注意到˚F前一個s參數:
v value1 value2 value3
s 1
f value1 value2 value3
EDIT2:法線平均
glm::vec3 tNormal;
for(int i = 0; i < vertices.size(); i++)
{
for(int j = 0; j < verticesInd.size(); j++)
{
if(verticesInd[j] == i)
{
tNormal += faceNormals[j/3];
}
}
aNormals.push_back(glm::normalize(tNormal));
tNormal = glm::vec3(0,0,0);
}
編輯3個面法線:
for(int i = 0; i < verticesInd.size(); i+=3)
{
glm::vec3 normal = glm::normalize(glm::cross(glm::vec3(vertices[verticesInd[i + 1]]) - glm::vec3(vertices[verticesInd[i]]), glm::vec3(vertices[verticesInd[i + 2]]) - glm::vec3(vertices[verticesInd[i]])));
faceNormals.push_back(normal);
}
該對象有50000個頂點和100000個面。對於每個頂點我需要檢查每個面,計算需要15分鐘在我的CPU上。 – Irbis
@Irbis這聽起來像是你正在以錯誤的方式迭代結構。查看更新。 – Alnitak
「@Irbis它聽起來像是你在錯誤的方向上遍歷結構」 - 請看看Edit2,它會帶來正確的結果。 – Irbis