2016-05-14 89 views
2

我有4點使用樣條曲線使用相機旅行,我如何使用glm :: gtx_spline :: catmullRom生成曲線?如何使用glm_gtx_spline :: catmullRom生成樣條曲線?

距離glm_gtx_spline函數http://glm.g-truc.net/0.9.4/api/a00203.html

genType catmullRom (genType const &v1, genType const &v2, genType const &v3, genType const &v4, typename genType::value_type const &s) 
+0

https://en.wikipedia.org/wiki/B-spline有一些控制點的描述/圖片。你只需要給出它想要的曲線,然後告訴它沿着你想要的曲線「有多遠」。沒有像opengl的「曲線」那樣的東西,所以你必須挑選你想要的樣條線上有多少個樣本,並多次調用catmullRom來獲取樣本。你調用的次數越多,看起來越好,但代碼越慢。 – xaxxon

+0

「多遠」位是最後一個參數。前4個是控制點。 – xaxxon

+0

那麼,控制點就是我想要去的地方?我怎樣才能設置多少位? –

回答

5

甲的Catmull-Rom樣條通常由若干段,每一個內插對連續的控制點的。 glm::catmullRom函數僅計算該曲線的一個,該段取決於四個連續控制點(p0,p1,p2,p3)。曲線段總是從p1p2去,而點p0p3隻影響曲線之間如何彎曲的,如圖所示的位置:

Catmull-Rom curve segment
(圖片由Hadunsford - 自己的作品,CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=28956755

通過按順序鏈接這些曲線段中的幾個,創建一個Catmull-Rom樣條曲線,該樣條曲線可以插入一系列(任意數量)的控制點。如果每個Catmull-Rom曲線段是從四個連續的控制點計算得到的,則結果樣條將是連續且平滑的(連續的)。

glm::vec3 catmull_rom_spline(const std::vector<glm::vec3>& cp, float t) 
{ 
    // indices of the relevant control points 
    int i0 = glm::clamp<int>(t - 1, 0, cp.size() - 1); 
    int i1 = glm::clamp<int>(t,  0, cp.size() - 1); 
    int i2 = glm::clamp<int>(t + 1, 0, cp.size() - 1); 
    int i3 = glm::clamp<int>(t + 2, 0, cp.size() - 1); 

    // parameter on the local curve interval 
    float local_t = glm::fract(t); 

    return glm::catmullRom(cp[i0], cp[i1], cp[i2], cp[i3], local_t); 
} 

給定矢量的Ñ控制點cp,下面的函數在參數t(其中t從0到Ñ -1)計算的Catmull-Rom樣條的值

在此實現中,相關控制點索引被限制在範圍內(0,n -1)。從概念上講,這實現了第一個和最後一個控制點的加倍,其效果是cp的第一個和最後一個控制點也被內插。

變0 之間和n -1參數t現在的平滑曲線在cp插值所有點上描繪出點。