NasriMethod&MinJaeMethod

相关文件:

  • NasriMethod.h
  • NasriMethod.cpp
  • MinJaeMethod.h
  • MinJaeMethod.cpp

NasriMethod

NasriMethod实现了Nasri 2012论文中的方法。

具体实现中是通过重写insert方法,按论文中的方式插入一列中间线。

#ifndef NASRIMETHOD_H
#define NASRIMETHOD_H

#include "Skinning.h"
class NasriMethod : public Skinning {
public:

    NasriMethod(const vector<NURBSCurve>& _curves)
        :Skinning(_curves) {

    }

    void init() override;
    // 插入一列中间线
    void insert() override;
};


#endif // !NASRIMETHOD_H

MinJaeMethod

MinJaeMethod实现了MinJae 2018论文中的方法。

具体实现中是通过重写insert方法,按论文中的方式插入两列中间线,并按照论文中的方法迭代更新插入的中间线控制点坐标,从而得到更好的形状。

#ifndef MINJAEMETHOD_H
#define MINJAEMETHOD_H

#include "Skinning.h"
class MinJaeMethod : public Skinning {
public:
    MinJaeMethod(
        const vector<NURBSCurve>& _curves, 
        int _sampleNum = 10, int _maxIterNum = 20, double _eps = 1e-5)
        :Skinning(_curves),sampleNum(_sampleNum),
        maxIterNum(_maxIterNum),eps(_eps) {

    }

    void init() override;        // 根据NUUBSCurve初始化T-preimage
    void insert() override;        // 在T-preimage中插入中间节点
    void calculate() override;  // 计算流程

private:
    void inter_init();          // 初始化中间点的坐标
    double inter_update();        // 更新中间点的坐标

private:
    const int sampleNum;
    const int maxIterNum;
    const double eps;
    map<double, map<double, Point3d>> initial_cpts;
};
#endif // !MINJAEMETHOD_H

其中calculate计算流程重写为:

void MinJaeMethod::calculate()
{
    // 1. compute s-knot for curves
    parameterize();
    // 2. construct basis T-mesh 
    init();
    // 3. insert intermediate vertices
    // the coordinate of vertices is the midpoint of the corresponding points in C_r and C_(r+1)
    insert();

    // 4. 初始化中间点坐标
    inter_init();
    update();

    // 5. 迭代更新中间点坐标
    double error = 1.0;
    for (int i = 0; i < maxIterNum; i++) {
        error = inter_update();
        update();
        cout << "*******************iter " << i+1 << ": ,error " << error << "********************" << endl;
        if (error < eps) {
            break;
        }
    }
}

其中每个步骤的具体实现见代码。

使用方法

main.cpp中包含了一些T样条曲面蒙皮方法的测试用例,可参照使用。

// main.cpp
Test::test_circle_skinning();
Test::test_venus_skinning();
Test::test_venus_skinning_helper_points();
Test::test_Bsurface_skinning();
Test::test_chess_skinning();
Test::test_ring_skinning();
Test::test_helicoidal_skinning();
Test::test_bonnet_skinning();
Test::test_door_skinning();
Test::test_face_skinning();
Copyright © Jiaming Ai 2019 all right reserved,powered by Gitbook本指南发布时间: 2020-03-08 17:22:48

results matching ""

    No results matching ""