甲的Catmull-Rom樣條通常由若干段,每一個內插對連續的控制點的。 glm::catmullRom
函數僅計算該曲線的一個段,該段取決於四個連續控制點(p0
,p1
,p2
,p3
)。曲線段總是從p1
到p2
去,而點p0
和p3
隻影響曲線之間如何彎曲的,如圖所示的位置:
(圖片由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
插值所有點上描繪出點。
來源
2016-05-19 18:27:54
jsb
https://en.wikipedia.org/wiki/B-spline有一些控制點的描述/圖片。你只需要給出它想要的曲線,然後告訴它沿着你想要的曲線「有多遠」。沒有像opengl的「曲線」那樣的東西,所以你必須挑選你想要的樣條線上有多少個樣本,並多次調用catmullRom來獲取樣本。你調用的次數越多,看起來越好,但代碼越慢。 – xaxxon
「多遠」位是最後一個參數。前4個是控制點。 – xaxxon
那麼,控制點就是我想要去的地方?我怎樣才能設置多少位? –