2010-10-27 98 views
1

我想繪製法線向量到網格文件,這樣我就可以看到法線向量如何從他們受人尊敬的面部反彈。在繪圖函數中,它繪製每個面並從面的中心點到(中心+法線向量)繪製一條線。然而,當我運行它時,我沒有看到任何紅線從每張臉上反彈。我在這裏做錯了什麼?繪製法線到曲面

void drawTria(myFace face) { 

    glNormal3f((face.getNormal().x), (face.getNormal().y), (face.getNormal().z)); 
    wired ? glBegin(GL_LINE_LOOP) : glBegin(GL_POLYGON); 
    glColor3f(0.0, 0.0, 0.5); 
    glVertex3f(vertexList.at(face.v1-1).x, vertexList.at(face.v1-1).y, vertexList.at(face.v1-1).z); 
    glVertex3f(vertexList.at(face.v2-1).x, vertexList.at(face.v2-1).y, vertexList.at(face.v2-1).z); 
    glVertex3f(vertexList.at(face.v3-1).x, vertexList.at(face.v3-1).y, vertexList.at(face.v3-1).z); 
    glEnd(); 


    // Drawing normals 
    glBegin(GL_LINES); 
    glColor3f(1.0, 0.0, 0.0); 
    glVertex3f(face.getCenter().x, face.getCenter().y, face.getCenter().z); 
    glVertex3f((face.getCenter().x+face.getNormal().x), (face.getCenter().y+face.getNormal().y), (face.getCenter().z+face.getNormal().z)); 
    glEnd(); 

} 

myVertex myFace::getCenter() { 
    myVertex center; 

    center.x = (vertexList.at(v1-1).x + vertexList.at(v2-1).x + vertexList.at(v3-1).x)/3; 
    center.y = (vertexList.at(v1-1).y + vertexList.at(v2-1).y + vertexList.at(v3-1).y)/3; 
    center.z = (vertexList.at(v1-1).z + vertexList.at(v2-1).z + vertexList.at(v3-1).z)/3; 

    return center; 
} 

myVertex myFace::getNormal() { 
    myVertex normal; 

    normal.x = ((vertexList.at(v2-1).y - vertexList.at(v1-1).y) 
         * (vertexList.at(v3-1).z - vertexList.at(v1-1).z)) 
         - ((vertexList.at(v2-1).z - vertexList.at(v1-1).z) 
          * (vertexList.at(v3-1).y - vertexList.at(v1-1).y)); 

    normal.y = ((vertexList.at(v2-1).z - vertexList.at(v1-1).z) 
         * (vertexList.at(v3-1).x - vertexList.at(v1-1).x)) 
         - ((vertexList.at(v2-1).x - vertexList.at(v1-1).x) 
          * (vertexList.at(v3-1).z - vertexList.at(v1-1).z)); 

    normal.z = ((vertexList.at(v2-1).x - vertexList.at(v1-1).x) 
         * (vertexList.at(v3-1).y - vertexList.at(v1-1).y)) 
         - ((vertexList.at(v2-1).y - vertexList.at(v1-1).y) 
          * (vertexList.at(v3-1).x - vertexList.at(v1-1).x)); 

    return normal; 
} 
+4

創建一個由單個三角形(0,0)(1,0)(0,1)組成的「模型」,並確保您的法線是預期的(0,0,1),並且您的中心點是合適的。 – genpfault 2010-10-27 15:10:15

+2

你也可以考慮簡化你的代碼。它很難閱讀,並且爲你的簡單任務執行了太多的操作 - 比如只需要一次就調用getCenter 6次等等。 – rotoglup 2010-10-27 18:40:16

+1

像genpfault說的那樣,把它簡化爲簡單的問題:getNormal()產生一個簡單的案例的正確答案? getCenter()?你也可以打印出'//繪製法線'下的頂點,看看第一個點是否與第二個點相同。 – LarsH 2010-10-28 02:03:45

回答

0

法線也可以指向錯誤的方向 - 例如,如果三角形的方向比正常可以進入你繪製的對象逆轉。此外,由於你的正常情況沒有正常化(單位長度),因此可能難以看到esp。如果你的三角形很小。