どうも、最近コタツでゴロゴロしかしていない たくあん です。
北の大地はいよいよガチで寒くなってきました。
前回どうしようかと考え試験的ですが、対一年生用に2D技術、二年生用に3D技術を
書いていこうかなとおもいます。
ただ、3Dに関してはDirectXオンリーになるとOpenGLとかの他のライブラリを使うときに
知識を使い回せないと思うので関数説明とかはしません。
その辺はマニュアル見ればわかりますので。
2D技術はそのままC言語で使えるように書こうかなと思いますが、
ただその技術使うためだけのゲーム作りはやめましょう。
それは失敗の原因ですので(私が失敗しました)。
[0回]
さて、本題に入りますね。
今回は2D技術ベジェ曲線について紹介します。
ベジェ曲線はN個の制御点からなるN-1次曲線の事です。
よく分からん人はベジェ曲線を画像検索してみればわかるかと思います。
制御点に関してはWikiみれば解りやすい作図法がありました。
http://ja.wikipedia.org/wiki/ベジェ曲線
下の制御点を求めるプログラムはこの作図法に基づいている・・・たぶん
これを使えば敵の動きを多彩にすることや、弾の弾道をより自然に曲がらせる事が可能です。
あとは座標以外に様々な値に設定すれば自由自在になるかもね。
まぁ使い方次第といったとこでしょうか、
では、やっていきましょう!
まず超簡単な式を書きます。
X = Px * t + Qx * ( 1 - t ) ;
Y = Py * t + Qy * ( 1 - t ) ;
です。
Qは開始点、Pは終了点です。
そして t は 0.0 ~ 1.0の値です。
そしてX,Yが現在の位置になります。
ですがこれでは直線しか移動できません。
この変化料の考えを使い曲線上に移動するなら・・・・
// 座標の構造体
struct Point {
float x; // 座標X //
float y; // 座標Y //
};
// 2次ベジェ曲線上の1つの座標を取得する関数
Point BezPoint( struct Point p0, struct Point p1 ,struct Point p2, float t ){
struct Point o = { 0, 0 };
float v = ( 1 - t ) * ( 1 - t );
o.x += v * p0.x;
o.y += v * p0.y;
v = 2 * t * ( 1 - t );
o.x += v * p1.x;
o.y += v * p1.y;
v = t * t;
o.x += v * p2.x;
o.y += v * p2.y;
return o;
}
第一引数に開始位置、第二に制御位置、第三に終了位置、第四に0.0~1.0までの変化量です。
ちなみに第四引数は大体でいいですが
もしFor文でまとめて配列に取得する場合は・・・
float plus = 1.0 / ( num - 1);
を宣言時にでも初期化しておいて・・・
for(i = 0; i < num; ++i){
p[i] = BezPoint(p0, p1, p2, t);
t += plus;
}
とすればいいかな?
あとは係数 t をうまくつかってやって下さい。
もちろんゲームループ内で使う場合は t に毎ループづつplusを加算していけばいいかな
あとは関数を改造するなり、お好きにどうぞ。
それから座標はfloatじゃないとうまく値がでません、細かい動きをするなら今後もfloatがメインかと思うので、
intを座標系で使用している方は早いうちにfloatで座標管理したほうがいいでしょう。
ん~正直C言語触ったの久々なんで(C#ばかり触ってたから)うまくいくかわからないw
てか、構造体と関数こんなだっけ? やばいなぁ完璧にわすれてるよ。
できなければごめんなさい(´・ω・`)
数学は苦手だぜっ!
以上!!
一年生にはできるだけ作りたいものが作ってもらいたいので、今回こんな感じで記事書きました。
できれば感想聞きたいかな。 実はN次ベジェ曲線なんかも作れるので、やってみて下さい。
あっ何も言わず使用したけど構造体ぐらいはわかるよね?
次は二年生用になんか書きます。
PR
COMMENT
無題
無題
ベジェ曲線は開始点、制御点、終了点、変化係数から曲線を描くというものでクォータニオンと違うと思う。
http://ruiueyama.tumblr.com/post/11197882224
補足にいいサイトがあったのでペタリしときます。
これでよりベジェ曲線がわかるでしょう。
さらに3Dでも応用が可能です、あまり参考サイト貼りすぎるのもあれだけど、jakani4さんのブログに面白いものがあったので紹介。
http://blender-linux-vol3.blogspot.com/2011/03/1-rot-quaternion.html
レーザーの弾道をクォータニオンで制御点を求めベジェ曲線の式を使って表現しているものです。
参考になればいいかな。
無題
開始・終了・制御 の値だけで理想的な曲線を得れるのは素敵ですね。
名前だけは聞いたことがあったけど、簡単にできそう