9.01.2008

QuadrupleDで六角大王の形状データを表示する方法だと思うよぉ。

そんなわけで、とりあえず形状データを読み込めたので報告。
というかメモ。

基本的なソースはチュートリアルのポリゴンモデルを表示してみようというやつ。
んで、使った3次元モデルのデータは、例によってCypherS TufTさんより拝借。
六角大王のデータまで公開してらっしゃるとは、実にすばらしい。

さて、六角大王のデータが用意できたら、チュートリアルのソースを改造する。
まずはuses節に
uses
...., D3D9, SXLib9, s_mathpack, ROKLoader

というように、ROKLoaderユニットを加えておく。

これで六角大王の形状データを読めるようになる。

当然、チュートリアルでTSXMesh型として定義されていた部分は必要ないので削除。
代わりに
ROKMesh: TSXMeshList; //六角大王形状データ

な感じでTSXMeshList型のオブジェクトを準備しておく。

これは、六角大王のメッシュデータがグループという単位にわかれているからと理解した。
このグループという単位でHumanMDLを用いてアニメーションをつけることができる。
んで、QuadrupleDではそのグループをメッシュという単位に置き換えて扱うわけだ。
さらに複数のグループでひとつのROKファイルを構成しているから、ROKファイルからの読み込み→メッシュのリストとして考えるという発想に至ったと思われる。

さて、ROKデータの読み込みだけれども、これはいたって簡単。
先ほどの続きとして考えると、
// 形状データの読み込み
ROKMesh := TSXMeshList.Create( DG );
ROKLoadFromFile( DG, 'junp.rok', ROKMesh, 60.0 );

ってな具合になる。
ROKLoadFromFile手続きは、ROKLoaderユニットに定義されている手続きで、第二引数に指定されたファイルを読み込んでTSXMeshListデータとして第三引数に格納するというもの。
内容はクリアされてしまうものの、第三引数に渡すオブジェクトはインスタンス化されている必要があることに注意。

こうして読み込みまで出来れば、「あとはメッシュのデータを格納するフレームを

MeshFrame: TSXFrame;

てな要領で準備して、そこのMeshプロパティに放り込めばいいんですね。わかります。」
と思ったあなた。それは早計だ。

なぜならTSXFrameのMeshプロパティは、TSXMeshのデータしか格納できないから。
そう、TSXMeshListのデータは格納できないのだ。

そこでどうするか?
考えた結果、私は次のような方法をとった。

まず、QuadrupleDにおいて、フレームというのは「親フレーム→子フレーム→孫フレーム→...」というような感じに階層構造をもっている。
そして、一つのフレームにつき、一つのメッシュを保持することができるわけだ。
さらに描画のときには、親フレームから末代のフレームまで辿って描画をしてくれる。
(少なくともチュートリアルの実装では)

ということは、先のように用意したMeshFrameの子孫フレームに、ROKファイル内に存在する各グループをメッシュとして保持してもらえばいいわけだ。
簡単な図にすると

MeshFrame
┣(しっぽの形状データ)
┣(あたまの形状データ)
┣(腕の形状データ)




という具合だ。
こうすることで、MeshFrameがMeshListを保持しているように考えることができる。

で、それを実現するために次のようなコードを書いた。

for i := 0 to ROKMesh.Count-1 do begin
TSXFrame.Create( MeshFrame ).Mesh := ROKMesh.Meshes[i];
end;

Delphiがオブジェクト指向言語だから可能な記述方法であって、さらにTSXFrameがインスタンスを作成するときに親フレームオブジェクトを要求するという構造だからこそ可能な芸当かもしれないが、こうして読み込んでおくことで、描画の際のコードはチュートリアルから一切手を加えなくとも、きちんと3次元モデルを表示することができる。

画像はこの方法で読み込んだROKデータ。

0 件のコメント: