ベジェ曲線とな

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

ベジェ曲線とな

投稿記事 by Dixq (管理人) » 13年前

STGを作る人なら一度は聞いたことあるこの曲線。
滑らかな線を描く時によく使われますが、私はよく物体の動作に使ってます。

ベジェ曲線を知らない人はwikiをどうぞ
http://ja.wikipedia.org/wiki/%E3%83%99% ... 2%E7%B7%9A

このベジェ曲線を簡単に使えるクラスを作ってみました。

http://dixq.net/zip/blog/Bezier.zip

定義値である
#define X1とY1がP1
#define X2とY2がP2
を示しています。0~1の値をセットして、変更して実行してみると関係が良く分かります。
以下、いくつか試してみました。

[youtube][/youtube]

これって二次元平面上を移動する時にも使えますが、私はモーションを徐々にブレンドしたり、
サッと動き始めて徐々に止まるなんて時に使ってます。
動画の最後を見て頂ければ分かりますが、y成分はxに関係なく決まるんですよね。
この値をブレンド率などに適用してやれば、sin波を使った滑らかな遷移のようなことが出来ます。

画像

βスプライン等と違って2点に依存するので、「動き初めは早く、動き終りは遅く」なんてことが可能です。

作ったクラスはtが時間で0から1まで変化する時

Bezier.Get( x1, y1, x2, y2, t );

みたいな感じで渡せばその時の座標を返してくれますが、このままではsin波を使った滑らかな遷移のような適用には適しません。
そこで

Bezier.Get( 動き初めは速く, 動き終りはゆっくり, モーション時刻 );

みたいな使い方が出来るようにしてみました。

float Get( ePrm_t ePrm1, ePrm_t ePrm2, float fRate );

と書いているのがそれです。コードを載せると長くなるので、ご覧になりたい方は配布コードをご覧ください。
最後にコメントアウトしているコードをループ内に移してもらえれば、それが確認出来ます。

しかし、本当はベジェよりもっとキツイカーブを描く曲線を作りたいんですよね・・。
今の実行結果って精一杯引っ張ってもせいぜいS字にしかならないですが、「直角なんじゃない?」って位まで大袈裟にカーブする曲線が作りたい・・。
もっとカーブ具合のパラメータがいじれる計算式ってないんでしょうかね~。
最後に編集したユーザー Dixq (管理人) on 2011年10月27日(木) 23:54 [ 編集 3 回目 ]

アバター
bitter_fox
記事: 607
登録日時: 14年前

Re: ベジェ曲線とな

投稿記事 by bitter_fox » 13年前

1.png
1.png (5.21 KiB) 閲覧数: 544 回
これでもまだまだ~って感じですか?

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: ベジェ曲線とな

投稿記事 by Dixq (管理人) » 13年前

おぉ、これはどういう計算を?

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: ベジェ曲線とな

投稿記事 by Dixq (管理人) » 13年前

2点重ねたベジェ曲線を引っくり返してもう一つくっつけた曲線か・・。
まぁ可能と言えば可能ですねぇ。
4次式、5次式のベジェ曲線みたいなんとか探せばいいのかな?あるのか知らないけど・・。

追記:
nissyさんより、ベジェ曲線はN - 1 次曲線だとご指摘頂きました。
普通に四次式にすればいいだけ・・?
ちと明日高次式で計算して試してみます~。

追記:
無事できました~!
nissyさんありがとうございました~!

↓6次方程式でやるとかなり直角っぽくなりました。
画像
最後に編集したユーザー Dixq (管理人) on 2011年10月28日(金) 01:25 [ 編集 4 回目 ]

アバター
bitter_fox
記事: 607
登録日時: 14年前

Re: ベジェ曲線とな

投稿記事 by bitter_fox » 13年前

おー、あれ6次だったんですか。ベジェ曲線って面白い曲線ですね。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: ベジェ曲線とな

投稿記事 by Dixq (管理人) » 13年前

面白いですよね!