永发信息网

求OpenGL计算顶点法线的详细注释

答案:1  悬赏:50  手机版
解决时间 2021-03-29 13:11
  • 提问者网友:动次大次蹦擦擦
  • 2021-03-29 01:14
求OpenGL计算顶点法线的详细注释
最佳答案
  • 五星知识达人网友:胯下狙击手
  • 2021-03-29 01:58

图1


void CalcNormals(const unsigned int* pIndices, unsigned int IndexCount, Vertex* pVertices, unsigned int VertexCount)        
{        
   for (unsigned int i = 0 ; i < IndexCount ; i += 3) { 
      //三顶点组合成一个三角面        
       unsigned int Index0 = pIndices[i];        
       unsigned int Index1 = pIndices[i + 1];        
       unsigned int Index2 = pIndices[i + 2];        
        //下面的v1,v2是计算出2个向量用于叉乘计算法线

       //v1如上图相当于 pIndices[i+1] - pIndices[i] 
       //v2如上图相当于 pIndices[i+2] - pIndices[i]
        
       Vector3f v1 = pVertices[Index1].m_pos - pVertices[Index0].m_pos;        
       Vector3f v2 = pVertices[Index2].m_pos - pVertices[Index0].m_pos;        
图2
        //图2  v1 = u; v2 = v    
        //   v1.Croos(v2)   相当余 U X V (红色线是左手坐标系中,右手坐标系的话则相反)
       Vector3f Normal = v1.Cross(v2);        
       Normal.Normalize();     //向量规范化    具体怎么计算如果你需要可以百度,也可以问我       
       pVertices[Index0].m_normal += Normal;         //向量加法计算出两个向量的中间向量
       pVertices[Index1].m_normal += Normal;         //就好像三角形中间分的线一样
       pVertices[Index2].m_normal += Normal;         //因为一个顶点可能被多个面所共享
   }        
   for (unsigned int i = 0 ; i < VertexCount ; i++) {        
       pVertices[i].m_normal.Normalize();         //最后的规范化
   }        
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯