我正在從.off file加載對象。該文件格式不定義對象的面或頂點的法線。我使用矢量產品找到了臉部法線。但是我爲找到每個頂點的法線而感到茫然,有什麼想法?如何找到對象的每個頂點的法線,以便我可以在OpenGL上應用平滑着色?
3
A
回答
4
平均共享頂點的所有面的法線。
也就是說,只需添加所有相鄰的臉部法線並對結果進行歸一化即可。
1
見例如"Computing normals to achieve flat and smooth shading"(方法ComputeVerticeNormal):
// Average all adjacent faces normals to get the vertex normal
GLpoint pn;
pn.x = pn.y = pn.z = 0;
for (int jx = 0; jx < nbAdjFaces; jx++)
{
int ixFace= m_pStorage[jx];
pn.x += m_pFaceNormals[ixFace].x;
pn.y += m_pFaceNormals[ixFace].y;
pn.z += m_pFaceNormals[ixFace].z;
}
pn.x /= nbAdjFaces;
pn.y /= nbAdjFaces;
pn.z /= nbAdjFaces;
// Normalize the vertex normal
VectorNormalize(&pn, &m_pVertNormals[ixVertice]);
2
一些.obj文件沒有法線的。你應該先計算每面法線:
給定的3個頂點V1,V2,V3,你可以計算出正常組成的臉: 正常的是V1之間的標準化跨產品 - v2和V1 - V3
N = Normalize((v1 - v2) x (v1 - v3))
Normalize(V) = V/length(V)
length(V) = SQRT (V.x * V.x + V.y * V.y + V.z * V.z)
叉積:
v × u = (v.y * u.z − v.z * u.y, v.z * u.x − v.x * u.z, v.x * u.y − v.y * u.x).
之後,你可以通過平均相鄰面的所有法線計算「平滑」法線。
0
「verage法線爲共享頂點的所有面。
也就是說,只需添加所有相鄰面法線和規範的結果。」
我試過這個,有時你會得到奇怪的結果,至少有兩個法線傾向於有一個180度的角度。
我認爲是更好地利用平分線:
你有3個正常的矢量:找到平分線向量2和3,然後找到平分線向量1和其他平分。然後使結果標準化。
相關問題
- 1. opengl中的平滑着色
- 2. OpenGL着色器:如何分別移動每個頂點?
- 3. C++/OpenGL/SFML頂點着色
- 4. 指定頂點着色器的法線的OpenGL ES 2.0
- 5. 使用OpenGL ES 2.0着色器的平滑紋理線條
- 6. 如何在有向圖中找到最小的一組頂點,以便可以達到所有其他頂點
- 7. 的OpenGL 2.0渲染多個對象以相同的着色器
- 8. OpenGL ES 2.0 - 在頂點着色器中找不到屬性
- 9. 是可以使用一個每個頂點正常的我的模型讓每個頂點的多條法線在OpenGL-ES 2.0
- 10. 我可以在頂點着色器中訪問gl_PointCoord嗎?
- 11. 我可以綁定頂點着色器的頂點屬性索引嗎?
- 12. 平滑的MKPolyline可以沿着路走
- 13. 如何在我的Mac上找到本地地址以便我可以scp?
- 14. 如何設置紋理以便我可以在Android OpenGL-ES 2.0片段着色器中使用它們?
- 15. 如何獲得腳本中的對象列表,以便您可以在每個對象上打印__doc__?
- 16. 使用着色器的頂點緩衝區對象/頂點數組對象
- 17. 在ggplot2下手動着色平滑線
- 18. 如何改變opengl中的相機,以便我可以在屏幕上看到我的整個表面情節?
- 19. X射線頂點着色器的OpenGL ES 2.0
- 20. 在圖中找到一組頂點,使每個頂點可以到達其他k個頂點
- 21. 我在哪裏可以找到着色圖紙的AS3工具?
- 22. 如何找到apk的動作/類,以便我可以從android
- 23. OpenGL:使用頂點着色器添加頂點
- 24. 在OpenGL ES 2.0頂點着色器中生成頂點
- 25. OpenGl基本頂點着色器
- 26. NormalMatrix for OpenGL頂點着色器?
- 27. 我們可以將自定義着色器動態應用到three.js對象嗎
- 28. 平滑頂點之間的顏色
- 29. 流星延遲查找(),以便我可以訪問對象
- 30. 是否可以對來自頂點着色器的點粒子進行排序?
這不是等價的,你需要規範化而不是分裂。 ([0,1] + [1,0])/ 2 = [0.5,0.5],其未被歸一化。 – msell 2010-11-30 08:49:34