メッシュの傾きに応じて落ちる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
紅葉

メッシュの傾きに応じて落ちる

#1

投稿記事 by 紅葉 » 16年前

BallMove関数でボールの制御をしています。

床とあたっていたらそれより上にボールのy座標を置く
ということをしたいです。
ただこの関数では床の傾きに応じては進んでくれません・・・

床が傾いてもその上に常にボールがあるようにするには
使用しているGs_CheckHeight関数をどのように拡張すればいいのでしょうか?

Justy

Re:メッシュの傾きに応じて落ちる

#2

投稿記事 by Justy » 16年前


>床が傾いてもその上に常にボールがあるようにするには
>使用しているGs_CheckHeight関数をどのように拡張すればいいのでしょうか?

 つまり、今予定と違う挙動をしており、その原因が Gs_CheckHeight()にある、
と考えているわけですね?

 では Gs_CheckHeight()の仕様をできるだけ具体的に詳しく書いてみて下さい。
 特に内部的にどういうパラメータを使って何を調べて、結果最終的に何を返す関数
なのかについても書いてみて下さい。

 多分それでどう直せばいいのか方向はつかめるはずです。

 

紅葉

Re:メッシュの傾きに応じて落ちる

#3

投稿記事 by 紅葉 » 16年前

指定したメッシュの上に物体があったらそれより上に物体を置くような戻り値
を返す関数です。
Gs_CheckHeightの最後の行に傾きもかけ合わせられるようにしたいのですが
掛け方がわからないので質問させていただきました・・・

D3DXIntersectというDirectXにある関数については
物体から直線?みたいなものを出してメッシュと当たっているかを判定しています。
一応、素人なりにこの関数を解析しましたができませんでした><

void CheckHeight(LPD3DXMESH lpMesh,D3DXVECTOR3 *pVec)
{
D3DXVECTOR3 ray;
BOOL isHit=FALSE;
DWORD faceCnt;
float u,v,dist;
LPD3DXBUFFER xBuf;
DWORD hitCnt;

ray=*pVec;
// ray.y+=1.0f;
ray.y+=4.0f;
// D3DXIntersect(lpMesh,&ray,&D3DXVECTOR3(0.0f,-1.0f,0.0f),&isHit,
// &faceCnt,&u,&v,&dist,&xBuf,&hitCnt);
D3DXIntersect(lpMesh,&ray,&D3DXVECTOR3(0.0f,-1.0f-0.090f,0.0f),&isHit,
&faceCnt,&u,&v,&dist,&xBuf,&hitCnt);
if(isHit) xBuf->Release();
if(isHit) pVec->y=ray.y-dist;
}

float Gs_CheckHeight(GsMESH id,float x,float y, float z)
{
D3DXVECTOR3 vec = D3DXVECTOR3(x,y,z);
CheckHeight(GsMeshHang[id].lpMesh,&vec);

return(F(vec.y));
}

紅葉

Re:メッシュの傾きに応じて落ちる

#4

投稿記事 by 紅葉 » 16年前

一応テストで書いてみたものをあげておきます。
間違えていますがここで投げだした質問ではないことを
分かっていただけますと助かります。

float Gs_CheckHeight2(GsMESH id,D3DXMATRIX m,float x,float y, float z)
{
D3DXVECTOR3 vec = D3DXVECTOR3(x,y,z);
CheckHeight(GsMeshHang[id].lpMesh,&vec);
D3DXVec3TransformNormal(&vec,&vec,&m);

return(F(vec.y));
}

Justy

Re:メッシュの傾きに応じて落ちる

#5

投稿記事 by Justy » 16年前


>一応、素人なりにこの関数を解析しましたができませんでした

 つまり、挙動がわからない怪しい関数を使っていると?(w



>一応テストで書いてみたものをあげておきます

 おっと、少し前進しました。
 少し合ってます。



>Gs_CheckHeightの最後の行に傾きもかけ合わせられるようにしたいのですが
>掛け方がわからないので質問させていただきました・・・

 D3DXIntersect()は端的に言えば、メッシュとレイ(点とそこからのベクトル)の
コリジョンを調べるものです。

 た・だ・し。
 この関数はローカル座標系でしか判定しません。
 つまり、グローバル座標系では移動していたり回転していたりする箱メッシュも
移動も回転もスケーリングもしていないローカル座標系のメッシュでしか
判定しません


 次に、レイの方ですが、こちらは判定に必要な情報として点とベクトルの2つがあります。
(D3DXIntersect()の第二・第三引数)

 点の方は引数で指定しているようですが、ではベクトルは? というと
何故か [0,-1.09,0]固定になっています。

 下向きなのは何となくわかるのですが、-1.09という数値がどこから来たものなのか
検討もつきません。
 少なくともこの関数はローカル座標での判定をするもの、ということはレイ情報にしても
メッシュから見た座標系……メッシュのローカル座標系で考える必要があります。

 従って、この Gs_CheckHeight()のインターフェースとしては真っ先に
行列を指定できるようにするべきでしょう。
 って、 Gs_CheckHeight2()の方はしてありますね。

 で、引数として与えられたグローバル座標系のレイの位置と下向きのベクトルを
同じく引数として与えられた箱の行列の“逆行列”を求めて、
レイの位置とベクトルをそれぞれ変換します。

 これで、箱のローカル座標系におけるレイ情報が求まりますので、
それを D3DXIntersect()にかけます。

 ここで接触している、と出たら交点に関する情報を返すことになるのですが、
少なくとも接触したかどうかの情報が必要になるので、Gs_CheckHeight()の戻り値は
bool型であった方がいいでしょう。

 接触した場合、この交点はやっぱりあくまでローカル座標系のものなので、
最初に引数として与えられた行列を掛けてさっきとは逆にローカル座標系から
グローバル座標系に直します。
 って、 Gs_CheckHeight2()の方はしてあ……るようですが D3DXVec3TransformNormal()ではなく、D3DXVec3TransformCoord()ではないでしょうか。
 実際のところ回転だけなら D3DXVec3TransformNormal()でもいいのかもしれませんが。

 後はこの交点を呼び出し元に戻せるように引数にポインタか参照を追加すれば、
この関数の機能としては十分でしょう。

 と、ここまでいろいろ書きましたが、多分オリジナルの Gs_CheckHeight()と CheckHeight()の
処理内容を半分くらいは理解しないと、この内容を理解および実践できるかどうか疑問です。

 まずはオリジナルの挙動、特に D3DXIntersect()について徹底的に調べてから、
周辺の挙動を追った上で修正に臨んだ方がいいかと思います。


 ちなみに床の上にボールを置くためには、どこかで妥協すれば別ですが
Gs_CheckHeight()を直しても今度はその使い方も正しく修正した上で、
移動処理の方法を仕様に合わせて少し見直さないと、最終的に正しく動かないような
気がします。

 なので、この関数を直しても見た目はまだおかしなままであることにご注意下さい。

Justy

Re:メッシュの傾きに応じて落ちる

#6

投稿記事 by Justy » 16年前

 実際のところ、球とメッシュのコリジョン判定をしているわけではないので、
レイを飛ばす方向がグローバル座標系において真下じゃない方がいいような気がします。

 一応引数でレイのベクトルも指定できるようにしておいた方がいいと思います。

 あと、引数の x, y, zなところは const VEC3&としてしまった方が楽ですよ。

紅葉

Re:メッシュの傾きに応じて落ちる

#7

投稿記事 by 紅葉 » 16年前

調べていたらこんな時間になってしましましたw

いろいろ調べて挑戦してみたのですが
ここが限界です・・・
できれば戻り値は当たっているかどうかではなくY座標の移動量を返したいです><

float Gs_CheckHeight2(GsMESH id,D3DXMATRIX m,float x,float y, float z)
{
D3DXMATRIX pOutM;
D3DXVECTOR3 vec = D3DXVECTOR3(x,y,z);
D3DXMatrixInverse(&pOutM, NULL, &m); // 逆行列
D3DXVec3TransformNormal(&vec,&vec,&pOutM);
CheckHeight(GsMeshHang[id].lpMesh,&vec);

return(F(vec.y));
}


具体的な修正案を書いていただけますと助かります><
すいませんが、本日も仕事がありますので寝ますw
遅くまでありがとうございます。

紅葉

Re:メッシュの傾きに応じて落ちる

#8

投稿記事 by 紅葉 » 16年前

const VEC3&はこれができてから実装します><
これならやり方はわかりますw

あととりあえず1面だけでいいのでその向きに移動させたいです。
以前作った添付したものではY座標がおかしかったので><
傾きのほうに進むのですが落ちて行ってしまいます。

もし以前のものでもできるのでしたら
上記ではなく添付したものの修正案を教えていただけないでしょうか?

今夜中に作成できると助かるのですがJustyさんもお忙しい身だと思いますので
お時間があるときにご教授してください><

紅葉

無題

#9

投稿記事 by 紅葉 » 16年前

Justyさん
どうか代わりに今回だけもう一度やっていただけないでしょうか?
とりあえず一面が転がっているように見えるだけで構いません。
どうかお願いします><

調べて見ましたが、どうしてもできません。
次からは一から自分でやりますのでお願いします。
と言いますか一からDirectXについて勉強してみたいと思います。
理解できるようになったらこの掲示板に戻ってきて恩返し?的なことをしたいですww

同人の方もPGが音信不通気味になってきました。
私の仕事は残り3つ(これを含め)ですのですべて終わりましたら
抜けようかと思います。
残りの課題は自分でどうにかします。
よろしくお願いします。

Justy

Re:無題

#10

投稿記事 by Justy » 16年前


>どうか代わりに今回だけもう一度やっていただけないでしょうか?

 正直どうしようか迷いました。
 ここは製作依頼版ではないですし、それは質問ですらありません。

 しかし、全くやる気がないわけでもなく、次からは一から自分でやる、と
仰っているので、それを信じることにします。

ttp://toku.xdisc.net/cgi/up/ttt/nm5584.zip.html
zip pass : asdfghjkl

 望んだ形になっているかどうかはわかりませんが、一応転がっています。
 仮に望んだ形でなくても、動作を解析し理解すれば修正できるでしょう。

 一応解説しておきますと、ボールは常に落下させるようにし、
箱にめり込んだことを検知したら、めり込んだ分を
押し戻すことで箱の上に載るように調整しています。

 肝は追加した関数 Gs_CheckIntersect()です。
 これで交点を求めています。

 後は頑張って下さい。



>一からDirectXについて勉強してみたいと思います

 是非そうして下さい。

紅葉

Re:無題

#11

投稿記事 by 紅葉 » 16年前

ありがとうございます><
近いうちに必ず戻ってきます。
私でも答えられそうな質問でしたらこれからも答えれるように努力します。
今までありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る