计算三角面顶点的法向量

1、计算顶点关联三角面的法向量

2、计算顶点关联三角面顶点所在角的角度弧度值,作为权重

顶点的归一化法向量为:顶点关联所有三角面的法向量以顶点所在角的角度弧度值作为权重的加权和 / 顶点关联三角面顶点所在角的角度弧度值之和

{
//std::vector<cv::Vec3f> vertex_normal(point_num); // vertex id => cv::Vec3f
vertex_normal.resize(point_num);

// store each vertex's total weight angle
std::vector<float> vertex_angle(point_num);

for( size_t i = 0; i < mesh_num; i++ ) {
        std::vector<cv::Vec3f> v(3);
        for( size_t v_i = 0; v_i < 3; v_i++ ) {
            size_t p_i = mesh.polygons[i].vertices[v_i];
            cv::Vec3f v_(cloud_rgb.points[p_i].x, cloud_rgb.points[p_i].y, cloud_rgb.points[p_i].z);
            v[v_i] = v_; // store the current mesh's points coords
        }
        cv::Vec3f e1 = v[1] - v[0];
        cv::Vec3f e2 = v[2] - v[1];
        cv::Vec3f fn = cv::normalize(e1.cross(e2)); // current mesh's normal

        // calc the triangle mesh's each vertex's angle
        double cos_t0 = (v[1] - v[0]).dot(v[2] - v[0]) / cv::norm(v[1] - v[0]) / cv::norm(v[2] - v[0]) * CV_PI / 180.0;
        double cos_t1 = (v[0] - v[1]).dot(v[2] - v[1]) / cv::norm(v[0] - v[1]) / cv::norm(v[2] - v[1]) * CV_PI / 180.0;
        double cos_t2 = (v[0] - v[2]).dot(v[1] - v[2]) / cv::norm(v[0] - v[2]) / cv::norm(v[1] - v[2]) * CV_PI / 180.0;
        double t[3] = {0, 0, 0};
        t[0] = acos(cos_t0); t[1] = acos(cos_t1); t[2] = acos(cos_t2);

        for( size_t v_i = 0; v_i < 3; v_i++ ) {
            size_t p_i = mesh.polygons[i].vertices[v_i];
            vertex_normal[p_i] += fn * t[v_i];
            vertex_angle[p_i] += static_cast<float>(t[v_i]);
        }
    }
    // normalize normals by angle weights
#pragma omp parallel for
    for( size_t i = 0; i < point_num; i++ )
        vertex_normal[i] /= vertex_angle[i];
}

 为什么这样算还没具体研究,只有个感性的认识。推导以后有需要再深入。

从二面角与面法线的关系可以窥探一二:

二面角的两条直线与法向量的两条直线组成一个四边形,每条法向量与其中一条直线组成角为直角,所以两条法向量组成的角与二面角的两条直线组成的角的和为180度,两条法向量夹角又可以是原来角的补角,与二面角的夹角相等,所以说二面角是法向量的夹角

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值