XNA でカーブを描画してみる

XNA には Curve クラスが用意されています。
詳細は、MSDNライブラリ を見て頂くとしてカーブを描くためのコントロールが必要と思ったのでちょっと実験してみました。

curvetest

使い方は何となくわかった気がします。
実験で作ったものなので、操作性はよくないと思いますがサンプルをアップロードしておきます。
Download : drawcurve

マップエディタ

マップエディタについて、ポリゴンが透けてしまう不具合は修正したのですが、操作感がいまいちだと思い修正中です。ツールなのであんまり時間をかける気は無かったのですが、将来的に重要なツールになることが発覚したので操作性には気を配りたいと思い見直しをすることにしました。妄想の域をでませんが、マップエディタに機能を追加していって、シナリオとかイベントとかを作成できるようにしたいと考えています。
ツールの操作性については、考え無しに高機能化を進めるとゴチャゴチャしていて難しそうという印象を与えてしまうと思っているのですが、詰め込みたい機能は色々あるし困ったものです。自分の場合、一般的なツールを選ぶ時に必要とする機能を持っていて、かつUIに違和感を感じずに直観的に操作できたものを自然と長く使うようになるので、そういうものを目指そうと思うのですがなかなか難しいです。

netKernel について

すごい世の中になったものだと思います。10年前から考えると夢物語のようなアーキテクチャが次々にでてくるものです。netKernel については、マルチコアのCPUを活用するためのプログラミングについて調べていて知りました。ややこしい説明になりますが、netKernel はマルチコアを活かすためのテクノロジという訳ではなく、netKernel によってマルチコアを活かすこともできるといった感じだと思います。あんまり理解できていません。
マルチコアCPUに対応したシステムは今後必要になると思いますが、アプリケーションレベルのプログラミングで解決すべき問題でもないと思います。マルチスレッドプログラミングでさえ、多くのユーティリティライブラリの助けを得なければまともに動かすことは難しいでしょう。
自分はというと、現状、通常のプログラミングモデルによる実装でCPUリソースは有り余っています。今後、アルゴリズムのミスによって、CPUリソースが枯渇化する可能性は大いにあり得ます。しかし、それはマルチコアによるマシンパワーで解決する前にアルゴリズムの最適化を行うべきと考えています。よってアルゴリズムの最適化を行った上でのマルチコア対応というスタンスで行こうと思います。自分のCPUリソースが足りなくなるころにはマルチコアに対応したテクノロジが充実していることを祈ってます。

マップエディタの不具合修正

先日書いたのですが、マップエディタで頂点の高さを変えていくとポリゴンが透けてしまう不具合がありました。法線ベクトルの計算に誤りがあると思っていたので、試しに法線ベクトルを描画してみました。

20090406-1

うーん、想像していた以上にダメでした。なんか、倒れてるし全然違う方向を向いていました。。。
まあ、原因がわかってよかったと思い法線ベクトルの計算を修正しました。

20090406-2

しかし、法線ベクトルの方向は考えていたようになったのですが、相変わらず透けてますね。。。
むかしSpriteBatchを呼び出した場合にRenderStateを書き換えるという処理でハマったのを思い出したのでブレイクポイントを設定して確認したらアルファブレンドに関連する項目が結構変わっていました。値を元に戻したら無事に描画できて、透けなくなりました。

このような不具合は後工程になるほど調べるのが大変になルと思うので、使ったら元に戻す習慣をつけてようと思いました。今回は使用しなかったのですが、XNA では PIX(ピクス)というツールが使えるそうです。PIX を使うのはかなり難しそうですが、使えればかなり力強いツールだと思います。
ひにけにXNA PIXを活用する その1
@IT 連載.NET&Windows Vistaへ広がるDirectXの世界

マップエディタの仕様を考える

マップエディタについては、ひとまず最低限の機能を実装しつつゲーム本体でも共有できる機能、例えばカメラクラスやフィールドクラスなどはしっかり作りこんでいこうと考えています。
ここで少し迷っています。現在作成中のマップエディタで高さを上げていくと向こう側が透けて見えてしまう不具合があります。原因は法線を再計算する処理に不備があると思われるのですが、修正しようとプログラムを見ていて思ったのが、テクスチャブレンドの必要性です。
現状、テクスチャブレンドによって適当に描いたフィールドが自然に見えるような効果を出していると思うのですが、逆にRPGツクールに代表されるようなマップチップにしてしまったほうがよいかもしれないと思いました。
うまく3Dのフィールドに取り込んで、昔ながらのRPGを表現できないものかと考えています。