久々の更新。技術系覚え書き。といっても後15分で家を出なきゃならんので適当に書きます。
OpenGLでペジェ曲線を書く時にNurbs関数を使いますが、これの使用方法がネットなどにもあまり乗っていなくて学習に困った。色々と調べて実験を繰り返した結果、やっと仕組みがわかってきた。
ポリゴンは次回に書くとして、今回はラインのみ。
まずセットアップで、NurbsObj = gluNewNurbsRenderer();
としてobjを作る。ここにデータが格納される模様。
プロパティを設定するとして
gluNurbsProperty(NurbsObj, ...., 2); 最後の数字は滑らかさを指定。数値が小さい方が滑らからしい。
とりあえずここまではよいとして次
gluNurbsCurve(NurbsObj, POINT_NUMBER, knotVector, 3, CtlPoint_val,4, GL_MAP1_VERTEX_3);
ここでNurbsObjは前述の通り
次のargは制限点の数
次は点のKnot情報。これが厄介。最初は意味が分からんかったけど、制限点の数によって内容がかわる。ここが重要
つまり、
制御点が1個の場合で、制御点の座標が(x,y,z)の三次元の場合は
knotVector[] = {0,0,0,0,1,1,1,1};
となる。ここで、最初の4つの0は、三次元の座標の場合はこれで固定。
問題は、その後の4つの1。
これは百聞は一見にしかずで、制御点を増やした時の変化を見てみよう
制御点2つ
knotVector[] = {0,0,0,0,1,2,2,2,2};
制御点3つ
knotVector[] = {0,0,0,0,1,2,3,3,3,3}
制御点4つ
knotVector[] = {0,0,0,0,1,2,3,4,4,4,4};
となります。
つまり
制御点n個(n>0)に対して
knotVector[] = {0,0,0,0,1,2,3........,n-2, n-1, n, n, n, n}; (最後に4つのn)
になる。
で、これを状況に応じて自動で設定するには、もちforループを使えばok
for(i=0; i<4;i++) // {0,0,0,0} ここで最初の4つの0を書く。
knotVector[i] = 0;
for(i=0;i<3+POINT_NUMBER;i++){ // {0,0,0,0,1,2...,n,n,n,n,n...,n} のこりを書く。
if(i>=POINT_NUMBER)
knotVector[i+4] = POINT_NUMBER;
else {
knotVector[i+4]= i+1;
}
}
わかりにくいけども
最初に4つ0を格納し、次に5番目の領域から数列を格納し、n番目に到達した時に、場合わけでnを4回格納。以上。
そして、制御点の座標は
float CtlPoint_val[POINT_NUMBER*3]; // Pointひとつにつき、三つの座標という意味で乗算。
for(i=0; i
CtlPoint_val[i] = rand();//x
CtlPoint_val[i+1] = rand();//y
CtlPoint_val[i+2] = rand();//z
}
こんな感じで格納すれば良か。
#include
srand((unsigned)time(NULL))忘れないでね。
これで、リアルタイムで制御点がかわっても、その都度計算し直してくれるよ。
GL_LINE_SMOOTHとか使わないといまいちかな。やっぱり。
あとこれ、どのくらい重たいのかなぁ。まだ実験していないけど。
ということで。ではでは。