2010-11-30 20 views

回答

4

平均共享頂點的所有面的法線。

也就是說,只需添加所有相鄰的臉部法線並對結果進行歸一化即可。

+0

這不是等價的,你需要規範化而不是分裂。 ([0,1] + [1,0])/ 2 = [0.5,0.5],其未被歸一化。 – msell 2010-11-30 08:49:34

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和其他平分。然後使結果標準化。

相關問題