1

我试图只设置某个人脸的颜色,而我的代码不断抛出错误。

该行mesh.set_color(*f_it, clr);抛出错误(关于属性错误)。我尝试将其更改为,mesh.set_color(f_it.handle(), clr);但这会引发取消引用错误。

我要正确设置颜色吗?

typedef OpenMesh::TriMesh_ArrayKernelT<> myMesh;
myMesh * Mesh;
myMesh mesh;

void computeFaceNormals(myMesh mesh) {
    OpenMesh::Vec3f pointA, pointB, pointC;
    myMesh::VertexIter vlt, vBegin, vEnd;
    myMesh::ConstFaceVertexIter cfvlt;
    myMesh::Color clr;

    for (myMesh::FaceIter f_it = mesh.faces_begin(); f_it != mesh.faces_end(); f_it++) {
        cfvlt = mesh.cfv_iter(*f_it);
        pointA = mesh.point(*cfvlt);
        pointB = mesh.point((*cfvlt++));
        pointC = mesh.point((*cfvlt++));

        clr[0] = 0;
        clr[1] = 1;
        clr[2] = 0;

        mesh.set_color(*f_it, clr);
    }

}
4

1 回答 1

3

openmesh Mesh ( OpenMesh::TriMesh_ArrayKernelT)可以使用不同的属性:顶点颜色、面颜色、顶点法线等。但是您需要明确指定您希望 Mesh 具有的属性。

就您而言,您缺少的是 mesh.request_face_colors();

如果您收到网格作为参数,您可以检查它是否已经具有颜色属性: mesh.has_face_colors()

您还可以使用以下方法删除属性: mesh.release_face_colors();

阅读教程以获取更多详细信息。您应该考虑的重要说明(来自教程)阐明了 request/has/release 的用法:

但是,如果顶点状态属性被请求了两次,会发生什么?然后第一个版本什么都不做,但第二个版本会删除它。标准属性有一个引用计数器,每次请求增加一,每次发布减少一。如果计数器达到 0,则该属性将从内存中删除。

于 2019-09-20T11:03:14.883 回答