LAB
研究室
デモプログラム
【なめらかな曲線補間】-Nonuniform spline-
スプライン曲線とは、通過する時間tと座標を指定することで、それを結ぶなめらかな補間曲線を描く曲線です。
このときに、時間と距離にムラがある場合には滑らかさと均等さを失います。
これをNonuniformスプラインで滑らかに生成しよう、というのが今回のお題です。
参考書籍は『Game Programming Gems 4 : 2.4 不均一スプライン (P166)』です。
編者:Andrew Kirmse
監訳:川西 裕幸
翻訳:中本 浩
ISBN:4-939007-90-1
発行・発売: 株式会社ボーンデジタル
この中には3種類のNonuniformスプラインが紹介されています。
丸み不均一スプライン(Rounded Nonuniform spline)
平滑不均一スプライン(Smooth Nonuniform spline)
時限不均一スプライン(Timed Nonuniform spline)
この中で手書き補間は平滑不均一スプラインが用途として適しています。
せっかくですので丸み不均一スプラインも実験してみました。
丸み不均一スプラインは指定した点を通過するのは通常のスプラインと同じです。
特徴は「補間点の移動速度がほぼ均一になるスプライン」で極端に折れ曲がらないスプラインになります。
記述では、レースゲームなどのコースの軌道補間などに適しているようです。
下の図が実際に丸み不均一スプラインを計算した結果になります。GPUでリアルタイムで描画しています。
緑色の点が通過点、オレンジの丸が補間点になります。
オレンジの丸印が比較的等間隔に並んでいることがわかりますね。
すこし描画に工夫して一般的なGPUのMSAAとは異なる高品質なスムーシングのかかった描画にしています。
階調は256階調出ますので256xMSAA相当の高品質アンチエイリアシングになっています。
実際には256回サンプリングしているわけではなく、衝突判定で遮蔽量を計算しています。
ルーペで拡大してみました。非常に滑らかで品質の高いアンチエイリアシングということがわかると思います。
ピクセルシェーダーでサンプリングしているのですが原理としては次のような仕組みになっています。
このようにすると普通に矩形で描画するよりも滑らかな丸い角で、綺麗なアンチエイリアスをかけることができます。
シェーダーで処理していますのでポリゴン分割なども発生しませんので頂点が増えたりしないのもメリットになります。
この滑らかなボリュームライン描画と前述のNonuniformスプラインを組み合わせて簡易的なペイントツールを作成してみました。
GPUでアクセラレーションがかかりますので応答が高速です。
すべてをGPUに依存していますのでGPUが弱いと逆にレスポンスが低下する可能性もあります。
マウスの軌跡をスプラインで補間していますので、高速にマウスをぐるぐる動かしても滑らかな軌跡を得ることができます。
【左】一般的なペイントツール 【右】今回のデモの軌跡補間
このデモは以下からダウンロードすることができます。
今回はスプラインのデモとペイントのデモの2種類を同梱しています。
◎動作可能な環境
<動作条件>
WindowsXP以降、DirectX9.0c
シェーダーモデル3.0以降
GeForce 6000シリーズ以降
Radeon HD1000シリーズ以降
特殊なレンダリング手法を用いていますのでドライバの不具合などで一部動作しない環境があるかもしれません。
なるべく最新のデバイスドライバで実行してください。
Download
HexaSpline.zip (約2.01MB)
【動作確認済ハードウェア】
nVIDIA GeForce9800GT
【操作方法】
■HexaSpline
カーソルを動かすと代表点の一つが操作可能です。
■HexaPaint
左クリック・・・オレンジでペイント
右クリック・・・黒でペイント
マウスホイール・・・ペン先の太さを変更
CATEGORY
- 製品事例 (7)
- デモプログラム (18)
- プログラムTIPS (41)
- C言語 (5)
- C++ (6)
- C++cording (4)
- Ruby (8)
- VisualStudioの使い方 (3)
- 最適化Tips (5)
- ゲーム開発テクニック (2)
- その他 (7)