diff --git a/include/eos/fitting/ceres_nonlinear.hpp b/include/eos/fitting/ceres_nonlinear.hpp index dba6a7bd..c4c03cd7 100644 --- a/include/eos/fitting/ceres_nonlinear.hpp +++ b/include/eos/fitting/ceres_nonlinear.hpp @@ -44,6 +44,12 @@ Eigen::Vector3 get_shape_at_point(const eos::morphablemodel::PcaModel& shape_ Eigen::Map> shape_coeffs, Eigen::Map> blendshape_coeffs); +template +Eigen::Vector3 get_shape_at_point(const eos::morphablemodel::PcaModel& shape_model, + const eos::morphablemodel::PcaModel& expression_model, int vertex_id, + Eigen::Map> shape_coeffs, + Eigen::Map> expression_coeffs); + template Eigen::Vector3 get_vertex_color_at_point(const eos::morphablemodel::PcaModel& color_model, int vertex_id, Eigen::Map> color_coeffs); @@ -402,6 +408,41 @@ Eigen::Vector3 get_shape_at_point(const eos::morphablemodel::PcaModel& shape_ return Eigen::Vector3(mean.cast() + shape_vector + expression_vector); }; +/** + * Returns the 3D position of a single point of the 3D shape generated by the parameters given. + * + * @param[in] shape_model A PCA 3D shape model. + * @param[in] expression_model A PCA 3D expression model. + * @param[in] vertex_id Vertex id of the 3D model that should be projected. + * @param[in] shape_coeffs A set of PCA shape coefficients used to generate the point. + * @param[in] expression_coeffs A set of expression coefficients used to generate the point. + * @return The 3D point. + */ +template +Eigen::Vector3 get_shape_at_point(const eos::morphablemodel::PcaModel& shape_model, + const eos::morphablemodel::PcaModel& expression_model, int vertex_id, + Eigen::Map> shape_coeffs, + Eigen::Map> expression_coeffs) +{ + // Computing Shape = shape_mean + shape_basis*shape_coeffs + + // expression_mean + expression_basis*expression_coeffs: + const Eigen::Vector3f shape_mean = shape_model.get_mean_at_point(vertex_id); + const Eigen::Vector3f expression_mean = expression_model.get_mean_at_point(vertex_id); + // Note: We seem to have a dependent name here, so we need 'template', to help the compiler that 'cast' + // is a template. + const Eigen::Vector3 shape_vector = shape_model.get_rescaled_pca_basis_at_point(vertex_id) + .leftCols(shape_coeffs.size()) + .template cast() * + shape_coeffs; + const Eigen::Vector3 expression_vector = expression_model.get_rescaled_pca_basis_at_point(vertex_id) + .leftCols(expression_coeffs.size()) + .template cast() * + expression_coeffs; + + return Eigen::Vector3(shape_mean.cast() + shape_vector + expression_mean.cast() + + expression_vector); +}; + /** * Returns the colour value of a single point of the 3D model generated by the parameters given. *