计算在C++中面临正常

Computing face normal in C++

本文关键字:C++ 计算      更新时间:2023-10-16

我正在尝试计算每张脸的法线。

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();时,所有以前的值都将替换为最后一个计算值。谁能给我一个建议,应该出什么问题?

编辑(添加了交叉产品)

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;
}

罪魁祸首可能是"normal = &vect1.crossproduct(vect2)"。函数调用"crossproduct"的值只是函数"computeNormal"中的临时值。退出函数后,此变量将变为无效。因此,指向它的指针"正常"指向垃圾值。您可以使用"myVector3D normal"而不是"myVector3D *normal"。