- ベストアンサー
DirectXのポリゴンモデルの表示方法について
- DirectXのポリゴンモデルの表示方法について簡単にまとめました。
- 3Dポリゴンモデルの表示をするための方法について解説します。
- DirectXでポリゴンモデルをプログラム内で記述して描画する方法について調べました。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>面の情報も必要で、それらは定義するつもりです。 であれば、プログラムで生成も可能。 >DirectXにはメッシュモデルという単位の考え方があり描画などを一括して行えます。非常に有用に思えたのですが、ただしメッシュモデルのデータは外部のツールを使って作成するもののようで 「メッシュモデルのデータは外部のツールを使って作成するもの」と言う認識は、半分だけ正解で、半分だけ間違い。 「メッシュモデルのデータは外部のツールを使って作成するのが一般的」って言うだけ。 「メッシュモデルのデータは外部のツールを使って作成する必要がある」と言うのは間違い。外部ツールが作成するデータと同じ物を自動生成できるなら、プログラムで自動生成したって構わないのです。 DirectXを使用する場合「xファイルを直接描画」なんて事はしません。 普通は、D3DXLoadMeshFromX関数でxファイルの中のマテリアル、テクスチャ、メッシュ情報をメモリに読み込んで、オブジェクトの位置や向きを変えるなど必要な演算を行ってから、レンダリングを行います。 「D3DXLoadMeshFromX関数でxファイルの中のマテリアル、テクスチャ、メッシュ情報をメモリに読み込んで」の部分を「プログラムで自動生成」に変えたって構いません。 xファイルの中に、三角形1個だけのダミーのメッシュと、必要なマテリアルと必要なテクスチャを仕込んでおいて、D3DXLoadMeshFromX関数でxファイルを読み込んだあと、ダミーのメッシュをプログラムで生成したメッシュ(頂点情報と面情報)に置き換えたって構わないのです。 ゲーム等で良くやる手法は、xファイルの中に、マテリアル、ダミーのテクスチャ、メッシュ情報を用意しておいて、D3DXLoadMeshFromX関数で読み込んだあと、別に用意しておいたテクスチャに差し替えて「色違いキャラを作る」と言う方法。 こうすると、1つの基本xファイルから「赤キャラ」「青キャラ」「緑キャラ」「黄キャラ」「ピンクキャラ」など、色違いキャラを生成できるので、簡単にレンジャー戦隊が作れます(笑) こういう事が出来るのも「xファイルを直接描画してない」からなのです。 もし「xファイルの中に入っているすべての情報」とまったく同じ物をプログラムで自動生成できて、D3DXLoadMeshFromX関数を呼び出したのとまったく同じ状態がプログラムで作れるのであれば、xファイルは使わなくたって構わないのです。
その他の回答 (1)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>また、別のモデリングソフトで「xファイル」を作って、というのも例えば幾何学的な多面体モデルを作りたいと思う場合にはあまり適していないように思います。(その場合、頂点の座標値は是非コンピュータ自身に計算させてセットしたいものです。) コンピュータに計算させるのは出来ても、出来上がった立体に面を貼るのは不可能。 >メッシュモデルのようなデータをプログラム上に記述したい場合、プログラム自身に座標値をセットさせたい場合、どうしたら良いのでしょうか? 座標値がセットできても、面を貼る事は不可能だから、実現不可能。 サイコロのような「立方体」を、回転させたり引き伸ばしたり変形させたりしてコンピュータに計算させ「8つの頂点」を得たとしよう。 その「8つの頂点」を元に、6面ある面に「三角形」を貼り付けないといけない。 この「三角形を貼り付ける」と言う作業、プログラムで単純に出来ると思う? プログラムで書く場合の「貼り付け条件」は「三角形の3つの辺のうちのどれか2つの辺は、正六面体の辺2つと一致していないと行けない」だけの、簡単な条件。 条件は簡単だけど「回転させたり引き伸ばしたり変形させたりたりした後の、立方体の辺」を、プログラムで探せると思う? 全部で「たった12本しかない辺」を、プログラムですべて見分けるのは可能だと思う? 8個の頂点同士を結べる「線」は、全部で28本ある。そのうち、16本は「辺ではない線」で、残った12本だけが「辺」として有効。 サイコロのような「超単純な立体」でもこんな感じなのに「数千の面が必要な立体に、頂点情報のみの状態から、正しく面を貼る」なんて事が、本当に出来ると思ってる? 頂点数が5000個を超える立体で「すごく近くに3つの頂点が近接して存在した」と仮定しよう。 その3つの頂点に、三角形を貼っても良いと思う? もしかしたら「立体に小さな穴が開いていて、その穴を取り囲む頂点が3つあった」のかも知れないよ? 「メッシュ」ってのは、その名の通り「網目」で出来てて、網目ってのは「点と線」で出来てる。「線」ってのは「どの点とどの点を結ぶか」って言う情報で、面ってのは「最低3本の線」で作られる。 しかも、その「面」には「裏表」があるんだよ。 頂点に面を貼る際の「貼り方の組み合わせ」は、事実上、無限にある。 無限にある組み合わせをコンピュータ上で正しく表示するには「どういう組み合わせになっているかを、予め、データファイルとして用意しておく」しかない。 その「め、データファイルとして用意しておいたもの」が「xファイルの中に入っている、メッシュモデル」なんだ。 ちょっと考えれば「頂点の数も、頂点の座標も、すべて完全一致している2つの立体があった場合、その2つはまったく同じ立体とは限らない」って事が判る筈。 片方の立体で面が貼られている位置は、もう片方の立体では「穴が開いている」かも知れないのだよ? 「面情報の無い、頂点だけのデータ」で、その2つが区別できると思う? 区別するには「予め、こっちは面が貼ってあって、こっちは穴が開いてるよ」って言う情報が必要。 その情報は「コンピューターじゃ自動生成できない」んだよ。
補足
返信ありがとうございます。自分の質問が要領を得ずすみません。 もちろんポリゴン立体を作成するのには点の座標値だけではなく面の情報も必要で、それらは定義するつもりです。(点の情報だけでポリゴンを作ろうというものではありません)。 今回は以前作ったWin32APIアプリケーションのポリゴン正多面体表示プログラムをDirectX化させたいと思い色々調べていたのですが、当時は点の座標値、面の繋がり点情報、法線などを自前の書式で構造体配列にしてGDIのPolygon関数で描画させていました。(その際の点の座標値、各面を構成する点のインデックスデータなどはプログラムに計算させてセットさせていました)。DirectXで書くときにこれらはこのままで良いのかなと思ったのが質問させて頂いたきっかけです。 GDIのPolygon関数をDrawPrimitiveで置き換えればプログラム自体の変更は少なくて済みそうに思えたのですが、DirectXにはメッシュモデルという単位の考え方があり描画などを一括して行えます。非常に有用に思えたのですが、ただしメッシュモデルのデータは外部のツールを使って作成するもののようで、これだと以前のプログラムで行っていたようなデータのセットがそのままでは行きません。何とかいい方法が無いかと思っていたところで上記の質問させていただきました。いずれにしても自分の質問が中々要領を得ない、つたないものになってしまい読み返して反省しております。 また何かお気づきのことなどありましたら教えて下さい。返信ありがとうございました。
お礼
>「D3DXLoadMeshFromX関数でxファイルの中のマテリアル、テクスチャ、メッシュ情報をメモリに読み込んで」の部分を「プログラムで自動生成」に変えたって構いません。 >もし「xファイルの中に入っているすべての情報」とまったく同じ物をプログラムで自動生成できて、D3DXLoadMeshFromX関数を呼び出したのとまったく同じ状態がプログラムで作れるのであれば、xファイルは使わなくたって構わないのです。 返信ありがとうございます。 「マテリアル、テクスチャ、メッシュ」、これらの情報の構造を勉強する必要がありそうですね。調べてみようと思います。 詳しい解説をありがとうございました。また何かありましたらよろしくお願いします。