2015■サンプル以下のリンクでサンプルをダウンロードできます。※サンプルはアニメーション処理も入っています。サンプル■概要このページでは階層有りXFileの概要説明と読み込みを行うまでの準備、知識についての説明を行っています。■階層有りXFileXFileはフレームと呼ばれる階層構造を使用してメッシュデータに親子関係を持たせることができます。この階層有りのデータを読み込む場合は通常のXFile読み込みとは別の方法が必要です。※通常の方法でも読み込めますが、階層情報は入っていません。以下のリンクで階層有りXFileの説明を行っています。-階層-■フレームとメッシュコンテナ階層つきのXFileでは「フレーム」と「メッシュコンテナ」という2つのデータ構造を使用します。●フレーム(Frame)フレーム(Frame)はXFileで設定されているフレームのデータです。データを格納するために「_D3DXFRAME」構造体が用意されています。*pFrameFirstChild子フレームのポインタ・継承このままでも使用可能ですが、各フレームの描画用の行列などを保存するメンバを追加するために、この構造体を継承して新しい構造体を作成する方法がよく使用されています。m_FrameDrawMatrix;};●メッシュコンテナメッシュコンテナ(MeshContainer)はフレーム内で設定されているメッシュやマテリアルをまとめたデータです。データを格納するために_D3DXMESHCONTAINER構造体が用意されています。pEffectsエフェクトインターフェースのポインタ※エフェクトはシェーダファイルと考えて問題ありません。*pNextMeshContainer次のメッシュコンテナのポインタ・継承メッシュコンテナもフレーム同様にD3DXMESHCONTAINERを継承したクラス、または構造体を用意し、そこに各プログラムで必要な情報を追加して使用されています。見かけるのはこのメッシュのマテリアルで使用しているテクスチャのポインタを格納できる配列です。*m_TextureList;};■読み込み準備DirectX9で階層有りのXFileを読み込む場合、パーサー関数として「D3DXLoadMeshHierarchyFromX」が用意されていますがD3DXLoadMeshHierarchyFromXを使用するには「ID3DXAllocateHierarchy」を継承したクラス、または構造体を用意する必要があります。●D3DXLoadMeshHierarchyFromXD3DXLoadMeshHierarchyFromXはXFileデータを解析してくれますが、その解析されたデータを使用したフレーム、メッシュコンテナの作成と削除は自作する必要があります。その作成、削除の関数がID3DXAllocateHierarchyに用意されています。●ID3DXAllocateHierarchyID3DXAllocateHierarchyはインターフェースでD3DXLoadMeshHierarchyFromXによって解析されたファイルデータのフレームとメッシュコンテナを自作するための純粋仮想関数が定義されています。以下は定義されている関数です。・CreateFrame・CreateMeshContainer・DestroyFrame・DestroyMeshContainer●CreateFrameCreateFrameは解析されたXファイルのフレーム情報からこのアプリ内で使用するフレームデータを作成するための関数で、D3DXLoadMeshHierarchyFromX呼び出しの際に自動で呼び出されます。宣言はID3DXAllocateHierarchy内に宣言が記述されているのでそちらを使用します。マクロなので宣言では外します。内容:フレームの作成を行い初期化します。この時に作成するフレームは自作フレームで作成し、必要なデータを設定します。定義は自作フレームにどのようなデータを持たせているかで内容は異なりますが、共通処理はフレームの名前をコピーする部分です。name);●CreateMeshContainerCreateMeshContainerは解析されたXファイルのメッシュコンテナ情報からこのアプリ内で使用するメッシュコンテナデータを作成するための関数で、D3DXLoadMeshHierarchyFromX呼び出しの際に自動で呼び出されます。宣言はID3DXAllocateHierarchy内に宣言が記述されているのでそちらを使用します。マクロなので宣言では外します。*ppNewMeshContainer:出力用のメッシュコンテナ内容:メッシュコンテナの作成を行い初期化します。この時に作成するメッシュコンテナは自作コンテナで作成し、必要なデータを設定します。定義はフレームと同じでどのようなデータを持たせているかで内容は異なりますが、引数を使用した共通処理の数がフレームとは違い多いことが特徴です。・メッシュ名のコピーメッシュ名をコピーします。name);・メッシュのコピーメッシュデータをコピーをします。隣接ポリゴン番号をコピーします。隣接ポリゴン番号:隣接ポリゴン番号とは1つのポリゴンに隣接しているポリゴンの番号のことです。3);・マテリアルのコピーマテリアルデータをコピーします。この時にマテリアルで使用しているテクスチャの読み込みも合わせて行います。container->pMaterials[0].MatD3D.Diffuse;}・データがないケースメッシュに法線がなかったり、マテリアルがなかったりする場合この関数内でデータの追加を行うことがあります。今回のサンプルではマテリアルがなかった場合の対応としてデフォルトのマテリアルを設定しています。●DestroyFrameDestroyFrameはCreateFrameで作成されたフレームを削除するための関数です。「CreateFrame」「CreateMeshContainer」とは違い自動で呼び出されないので、自分で呼び出す必要があります。宣言はID3DXAllocateHierarchy内に宣言が記述されているのでそちらを使用します。マクロなので宣言では外します。pFrameToFree:削除対象のフレーム内容:フレームの削除を行います。CreateFrameで動的に確保したメモリを解放します。●DestroyMeshContainerDestroyMeshContainerはCreateMeshContainerで作成されたメッシュコンテナを削除するための関数です。「CreateFrame」「CreateMeshContainer」とは違い自動で呼び出されないので、自分で呼び出す必要があります。宣言はID3DXAllocateHierarchy内に宣言が記述されているのでそちらを使用します。マクロなので宣言では外します。pMeshContainerToFree:削除対象のメッシュコンテナ内容:メッシュコンテナの削除を行います。CreateMeshContainerで確保した動的メモリの解放を行います。CreateMeshContainerで確保するメモリは種類が多いので忘れないようにする必要があります。);};探している内容が見つからなかったら以下のサイトにあるかもしれません。筆者が開発にかかわらせてもらったアプリのリンクです。