2014-02-20 30 views
1

我正在計算每張臉部的法線。在C++中計算正常的臉部

void myFace::computeNormal() 
{ 
    myHalfedge* e1 = adjacent_halfedge; 
    myHalfedge* e2 = e1->prev; 
    myVertex* v1 = e1->source; 
    myVertex* v2 = e2->source; 
    myVertex* v3 = (e1->next)->source; 
    myPoint3D* p1 = v1->point; 
    myPoint3D* p2 = v2->point; 
    myPoint3D* p3 = v3->point; 
    myVector3D vect1 = *p3-*p1; 
    myVector3D vect2 = *p2-*p1; 

    normal = &vect1.crossproduct(vect2); 
} 

void myMesh::computeNormals() 
{ 
    myFace* f = NULL; 
    for (int i = 0; i < faces.size(); i++) 
    { 
     f = faces[i]; 
     f->computeNormal(); 
    } 
} 

但是,當調用f->computeNormal();時,所有先前的值將被上一次計算的值替換。任何人都可以給我一個建議,什麼應該是錯的?

EDIT(由交叉積)

void myVector3D::crossproduct(myVector3D & v1, myVector3D & v2) 
{ 
    dX = v1.dY * v2.dZ - v1.dZ * v2.dY; 
    dY = v1.dZ * v2.dX - v1.dX * v2.dZ; 
    dZ = v1.dX * v2.dY - v1.dY * v2.dX; 
} 

myVector3D myVector3D::crossproduct(myVector3D & v1) 
{ 
    myVector3D result; 
    result.crossproduct(*this, v1); 
    return result; 
} 
+0

crossproduct()是如何定義的?和會員正常?電話看起來很可疑。 – laune

+0

正常定義爲'myVector3D *正常;' – kmaci

+2

'normal =&vect1.crossproduct(vect2);'獲取臨時地址* - 返回的myVector3D必須按值保存。當堆棧彈出時,「普通」指針無效,下一次調用'crossproduct'會在堆棧中的相同位置創建下一個產品,因此可以看到舊的無效指針。 –

回答

3

罪魁禍首可以是在 「正常= & vect1.crossproduct(vect2)」。函數調用「crossproduct」的值在函數「computeNormal」中只是臨時值。退出該功能後,該變量變爲無效。所以指向它的指針「正常」指向垃圾值。您可以使用「myVector3D normal」而不是「myVector3D * normal」。

+0

當我將'myVector3D * normal;'更改爲'myVector3D normal;'時,我遇到同樣的問題。 – kmaci

+0

你改了'normal = vect1.crossproduct(vect2);'太對了? – taytay