今後、力をいれていきます。
PSMゲーム
Bloodred Wyvern (ブラッドレッドワイバーン)
Bloodred Wyvern 2
Gravity Anomaly Zone 不可思議重力帯
その他
PlayStation®Mobile関連リンク集
PlayStation®Mobile学習日記
XBLIG
BLASTER AND AMETHYST
BLASTER AND MORION
LEUCISTIC WYVERN
Bioerosion
URGENT EVASION 360
The Undead Syndrome / TUS 2
Dark Storm Blast 360
その他
Making Of The Undead Syndrome[3DCG]
Making Of The Undead Syndrome2
XNA関連リンク集
xna学習日記
第1〜3話
第4〜5話
第6〜7話
第8〜9話
第10〜12話
第13〜14話
第15話
ブラウザゲーム
発火少年の地面焦がし
MAGICAL METEOR SHOWER
メタセコイア備忘録
東日本大震災(Aftermath of the 2011 Tohoku earthquake and tsunami)
ムカゴソフトウェア開発
e-mail:cqp00202@nifty.ne.jp
第12話のラストに追記した・・・
追記:今回は、この件をはっきりさせたい。
BoundingSphere.CreateMergedメソッドを用いて、複数のバウンディングスフィアを、1つのBoundingSphereに結合していくことが可能・・・なのかな?
その前に、少々修正したい箇所がある。
第13〜14話では、バウンディングスフィアを、目で確認できるようにした。
さらに、球体をワイヤーフレームで描画すれば、その中の立体モデルが見えるので分かりやすくなる。
そこで、第13話のサンプルコードのDraw()メソッド、球体の立体モデルを描画するコードの前後に、 「graphics.GraphicsDevice.RenderState.FillMode = FillMode.WireFrame;(ワイヤーフレーム)」と、「graphics.GraphicsDevice.RenderState.FillMode = FillMode.Solid;(デフォルトの値に戻す)」を追加した。
graphics.GraphicsDevice.RenderState.FillMode = FillMode.WireFrame; //ワイヤーフレーム //自キャラのバウンディングスフィアの立体モデルの描画 DrawModel(testsphere, Matrix.CreateScale(samplebound.Radius) * Matrix.CreateTranslation(samplebound.Center)); //敵キャラのバウンディングスフィアの立体モデルの描画 DrawModel(testsphere, Matrix.CreateScale(testbound.Radius) * Matrix.CreateTranslation(testbound.Center)); graphics.GraphicsDevice.RenderState.FillMode = FillMode.Solid; //元に戻す
これで、バウンディングスフィアが、ワイヤーフレームで描画されるようになった。
第12話にBoundingSphere.CreateMergedメソッドのことを追加した時点では、BoundingSphere.CreateMergedメソッドを使えば、各メッシュが持つ複数のバウンディングスフィアを、1つのBoundingSphereのインスタンスで(複数の球体のまま)管理できるのかと想像していた。
しかし、BoundingSphere構造体が、そんな仕組みになっているとはとても思えない。
もしかすると、BoundingSphere.CreateMergedメソッドで結合した場合、該当の立体モデル全てを包み込む、更に大きな1つの球体が作成されるだけなのかもしれない。その方が自然だし。
その辺を確認したい。
今回もまた、前回第14話で用意した3つのメッシュを持つ階層付きX形式ファイルを使用する。
とりあえず、BoundingSphere.CreateMergedメソッドを用いて、自キャラの1つ目のメッシュ(謎のメカ)と3つ目のメッシュ(緑の六角錐)のバウンディングスフィアを結合してみる(敵キャラはそのまま)。
Update()メソッドの、バウンディングスフィアの中心と半径を設定するコードを、以下のように変更した。
BoundingSphere bs = new BoundingSphere(); //作業用 bs.Center = model_pos + samplemodel.Meshes[0].BoundingSphere.Center; bs.Radius = samplemodel.Meshes[0].BoundingSphere.Radius; samplebound.Center = model_pos + samplemodel.Meshes[2].BoundingSphere.Center; testbound.Center = test_pos + testmodel.Meshes[0].BoundingSphere.Center; samplebound.Radius = samplemodel.Meshes[2].BoundingSphere.Radius; testbound.Radius = testmodel.Meshes[0].BoundingSphere.Radius; //BoundingSphereの結合テスト samplebound = BoundingSphere.CreateMerged(samplebound, bs);
実行結果
バウンディングスフィアが、自キャラの「謎のメカ」部分のメッシュと、緑の六角錐のメッシュをきちんと被っている・・・かな。
この結果から判断すると、やはりBoundingSphere構造体の1つのインスタンスに複数の球体が保持されるのでは無く、あくまで1つの(新たな中心の位置と半径の)球体にまとまるのが正しいのかな。
少なくとも、個別の物体が複数あるような立体モデルには、この方法は向いていなかったか。
1つの立体モデルに1個の物体しかなく、それを構成するパーツが複数のメッシュに分かれているケースの為の機能かな。
第13話のサンプルコードでは、自キャラを(Y軸を中心として)回転させると、バウンディングスフィアのY軸が微妙に揺れ動く問題が生じていた。
それは、自キャラとそのバウンディングスフィアの中心点に、誤差が生じていたせいだ。
※サンプルコードを実行して、左スティックを左右どちらかに傾ければ分かります。
でも、それは単にモデラー側で、立体モデルの中心点を、正しい座標に設定し直せば済む話である。
第13話の段階では、この立体モデルは1つのメッシュしか持っていない。
つまり、立体モデル全体の中心点が、Model.Meshes[0].BoundingSphere.Centerの値と等しくなる・・・と考えていた。
そんな訳で、この問題は簡単に解消できそうなので放置していた。(苦笑)
で、実際に、自キャラの中心点を、正しい位置に調整することにした。
まずはモデラーであるメタセコイアを起動。
続いて、自キャラの立体モデル「謎のメカ」を読み込む。
その上で、メニューにある[オブジェクト]−[位置合わせ]を選択。
その中心を0に設定した上で、X形式ファイルを作成し直した。
これで、自キャラとバウンディングスフィアの中心点が一致するはずだ・・・が、それでも、なぜか中心点がズレてしまう。
そこで、いくつかの別の立体モデルで試してみたのだが、単純な形状であれば、中心点は一致するものの、複雑な形状になるとなぜか誤差が生じることがあった。
もしかすると、立体モデルの中心点の計算方法が、メタセコイア側の位置合わせ機能と、ModelMesh.BoundingSphereプロパティとでは異なるのではないだろうか?
あまり考えたくない話だけど・・・。(苦笑)
たとえば、左の画像の立体モデル(メッシュは1つ)で試してみると・・・
メタセコイアの位置合わせ機能で、立体モデルの中心を0に設定。
その後、X形式ファイルを作成。
それを、第13話のプロジェクトに組み込んだ。
ここで使用したメタセコイア形式のファイルはこちらからダウンロードできます。
自分で確かめてみたい人はどうぞ。
(X形式ファイルを出力する際の拡大率は、1x0桁)
これでデバッグを開始した結果が左の画像(クリックで拡大表示)である。
ただし、バウンディングスフィアは、ワイヤーフレームで描画している。
また、画面上に、バウンディングスフィアと自キャラの中心位置を表示するようサンプルコードを改造している。
・バウンディングスフィアの中心の位置:samplebound.Centerの値
・自キャラの中心位置:model_posの値
この立体モデルの場合、バウンディングスフィアとX座標は一致するようだが、Y、Z座標は僅かな誤差が生じている。
Y座標は動かさないのではっきりしないが、Z座標は、常に約0.6956の(ほぼ一定の)誤差が生じるようだ。
それとも、使用するモデラーによって、このような誤差が生じるのは当たり前だと捉えた方がいいのだろうか。
てもって、立体モデルを読み込んだ直後に、バウンディングスフィアの中心位置との誤差を調整する処理を加えれば、解決できそうな気はするけど。
でも、これ、僕の大きな勘違いだったりして。
それはそれでショックだ。(苦笑)