ゲームつくろ〜質問箱
(現在 過去ログ3 を侮ヲ中)

HOME HELP 新規作成 新着記事 トピック侮ヲ 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■2415 / inTopicNo.1)  DirectX9での、「フェイスを表す頂点のインデックスの列」の取得方法
  
□投稿者/ 鳥猫 -(2009/11/20(Fri) 06:19:42)
    はじめまして。
    いつもDirectXおよび衝突判定系のページを読ませて頂いております。
    独学の為、こちらのサイトが無ければ開発は本当に不可能に近いものでした。
    感謝しております。

    そして、早速質問なのですが、
    3D地形との衝突判定で、1つの架空の三角形上の正しい高度を生成する所まで出来ました。
    LockVertexBuffer 〜 頂点、法線座標を取得する方法も実装できました。

    しかし、
    肝心の「フェイス(三角形or四角形)を表す頂点のインデックスの列」
    が取得方法が解らず困っています。

    これはどうすれば取得できるでしょうか・・?
    応急的にXファイルから直読み込みする気ですが、教えて頂けると幸いです。


    また、こちらは要望程度になるのですが、
    3D地形で、すべるポリゴン、通行不可能なポリゴンなど、
    地形を彩る工夫の仕方が有れば嬉しいなと思います。
    (膨大過ぎて気付いてないだけで、もし存在してたらすみません;)
引用返信 削除キー/
■2416 / inTopicNo.2)  Re[1]: DirectX9での、「フェイスを表す頂点のインデックスの列」の取得方法
□投稿者/ IKD -(2009/11/20(Fri) 07:43:02)
http://marupeke296.com
     鳥猫さん、ご質問頂きましてありがとうございます。
     
     メッシュ(ID3DXMesh)から三角ポリゴンを取得する直接的なメソッドはID3DXMeshに用意されていません。そのため、自前で実装する必要があります。
     
     ただ、鳥猫さんの今回の仕様に限って言えば、実はD3DXIntersectというヘルパー関数を使うとかなり楽に欲しい情報を得る事ができます。この関数はメッシュにレイ(線分)を飛ばし、当たったポリゴン情報をごそっと返してくれます。ですからこの関数を使って地形メッシュに向かって真っ直ぐレイを飛ばせば、衝突したポリゴン情報をたちどころに取得できます。
     
     詳しくはマニュアルをご参照いただきたいのですが、pFaceIndexというところに当たったポリゴンの番号が返ってきます。ポリゴンの番号があると、メッシュのインデックスを辿ってポリゴンの頂点を得る事が可能になります。
     
     例えば10番のポリゴンに当たっているという情報を得たとします。ID3DXMesh::LockIndexBufferメソッドでインデックスバッファをロックし取得したインデックス配列のポインタをpとすると、
     
     I1 = p[10 * 3]
     I2 = p[10 * 3 + 1]
     I3 = p[10 * 3 + 2]
     
    と10番のポリゴンを構成する頂点のインデックス番号を取得できます。×3倍しているのは、インデックス配列が常に3つのWORD(もしくはDWORD)の並びで一塊になっているからです。

     インデックス番号を得れば、後は頂点バッファをロックして、そのインデックスに該当する頂点を手繰れば良いだけです:
     
     P1 = v[I1]
     P2 = v[I2]
     P3 = v[I3]
    (vは頂点バッファへのポインタ)

     実はD3DXIntersectにはレイが当たった場所もピンポイントで教えてくれます。pU及びpVという所に「重心座標(Barycentric coordinates )」という値が返ってきます。ポリゴンの3頂点とこの重心座標があると、当たった位置を、
     
     P = V1 + U(V2 - V1) + V(V3 - V1)
     
    という式で計算できます。ここでV1〜V3はポリゴンの頂点(順番に注意)、UとVは先の関数が返す重心座標です。

     ちょっと細々とした手続きがありますが、以上の方法でフェイスの情報を取得できると思いますのでお試し下さい。
     
     
    (ご要望のポリゴンに属性を付けるのはメッシュに属性値を埋め込むなどの方法があります)
引用返信 削除キー/
■2418 / inTopicNo.3)  Re[2]: DirectX9での、「フェイスを表す頂点のインデックスの列」の取得方法
□投稿者/ 鳥猫 -(2009/11/20(Fri) 18:29:42)
    そんな便利な関数があったのですね・・。
    手当たり判定処理をしなければいけない とばかり思っていました。

    この関数を使えば他の機能も楽に実装できそうですね。
    色々、仕様や実装例も調べて取り込んで行きたいと思います。

    >要望 〜〜 メッシュに属性値を埋め込むなどの方法
    むむ・・ちょっと具体的に想像できませんが、複数のマテリアルとして数値設定する
    等でしょうか。うっかり負荷を増やすと怖いですし、何か色々方法を考えてみます。

    それでは、
    メインの質問の実装に成功したら解決のチェックを入れに来ようと思います。
    お忙しい中素早くご回答して頂き、ありがとうございましたっ orz
引用返信 削除キー/
■2428 / inTopicNo.4)  Re[3]: DirectX9での、「フェイスを表す頂点のインデックスの列」の取得方法
□投稿者/ 鳥猫 -(2009/11/22(Sun) 00:04:35)
    ありがとうございました。
    未解決部分が有るのですが、ここに出てない話なので
    別途質問させて頂きたく・・締め切らせて頂きます。
済!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

書き込み不可

Pass/

HOME HELP 新規作成 新着記事 トピック侮ヲ 検索 過去ログ

- Child Tree -