配置
参考之前的博客项目102。
代码分析
首先,加载并绘制网格
igl::readOFF(TUTORIAL_SHARED_PATH "/screwdriver.off", V, F);
igl::opengl::glfw::Viewer viewer;
viewer.data().set_mesh(V, F);
然后,设置颜色
第一种方法
viewer.data().set_data(D);
D是一个V * 1的向量,每个顶点对应一个值。
set_data
将三角形进行线性插值着色(在fragment shader片段着色器中),并使用这个插值数据在colormap颜色容器(存储为纹理)中查找颜色。colormap默认为igl::COLOR_MAP_TYPE_VIRIDIS,具有21个离散间隔。可以使用set_colormap设置自定义的颜色映射。
Eigen::MatrixXd V;
Eigen::MatrixXi F;
Eigen::VectorXd D;
定义一个一维数组D,
D=V.col(0);
可以让矩阵V的第1列作为插值数,如果设置第二列就是col(1),因为D的行数要和V的行数保持一直(其实就是顶点的个数)
viewer.launch();
最后启动视图查看。
第二种方法
网格顶点的颜色C是根据它们的笛卡尔坐标设置的。
这里的坐标是规范化之后的。
C =
(V.rowwise() - V.colwise().minCoeff()).array().rowwise()/
(V.colwise().maxCoeff() - V.colwise().minCoeff()).array();
.minCoeff()返回引用表达式的每列(行)的最小系数的行(或列)向量表达式。
代码中使用以下set_colors功能将颜色与面或顶点相关联 :
viewer.data().set_colors(C);
C是一个#C×3的矩阵,每行有一种RGB颜色。C的行数必须与网格的面数或顶点数相同。根据C的大小,查看器将颜色应用于面或顶点。