###前提・実現したいこと
現在オブジェクトとのレイでの当たり判定について悩んでいます。
もう少し詳しく言いますとレイ判定後の移動についてですが、、、
###発生している問題・エラーメッセージ
現在、壁のオブジェクトを回転、縮小などをしてマップに配置をしているのですが
そのオブジェクトにレイで判定をとり当たっているのであれば滑りベクトルの計算をして滑らせる処理をプログラムで書いてはいるのですが、回転したオブジェクトに当たるとうまく滑ってくれません。
回転していないオブジェクトに対してはちゃんと滑ってくれます。
D3DXMatrixInverseを使って逆行列を使用しているのでレイ判定は大丈夫だと思うのですが、やはり回転しているオブジェクとだとうまく滑ることができません。
何がダメなのかが全く分からずつまずいています。
回答よろしくお願いします
記載するソースコードはレイ判定を行っているところのコードと滑りの計算をしているところのコードを載せます。
###該当のソースコード
////////////////////レイ判定////////////////////////
/**
レイによる衝突判定 レイが相手メッシュと交差する場合は、pfDistanceに距離を、pvNormalに衝突面の法線を入れてtrueを返す
@D3DXVECTOR3 vStart //レイを飛ばすスタート位置
@D3DXVECTOR3 vDir //レイの飛ばす方向
@MODELS* pMesh //レイとの判定をとりたいオブジェクト
@FLOAT* pfDistance //レイが当たった時の距離
@D3DXVECTOR3* pvNormal//レイが当たった時の衝突面の法線
@THING* pThingB //レイとの判定をとりたいオブジェクトの情報(回転、拡大など)
/
BOOL Collide(D3DXVECTOR3 vStart, D3DXVECTOR3 vDir, MODELS pMesh, FLOAT* pfDistance, D3DXVECTOR3* pvNormal, THING* pThingB)
{
//レイ判定用フラグ
BOOL boHit = false;
D3DXMATRIX mWorld; D3DXVECTOR3 vStartl; D3DXVECTOR3 vDirl; D3DXVECTOR3 vEnd; vEnd = vStart + vDir; // レイを当てるメッシュが動いていたり回転している場合でも対象のワールド行列の逆行列を用いれば正しくレイが当たる D3DXMatrixInverse(&mWorld, NULL, &pThingB->mWorld); D3DXVec3TransformCoord(&vStartl, &vStart, &mWorld); D3DXVec3TransformCoord(&vEnd, &vEnd, &mWorld); vDirl = vEnd - vStartl; DWORD dwPolyIndex; D3DXIntersect(pMesh->pmesh, &vStartl, &vDirl, &boHit, &dwPolyIndex, NULL, NULL, pfDistance, NULL, NULL); if (boHit) { //交差しているポリゴンの頂点を見つける D3DXVECTOR3 vVertex[3]; FindVerticesOnPoly(pMesh->pmesh, dwPolyIndex, vVertex); D3DXPLANE p; //その頂点から平面方程式を得る D3DXPlaneFromPoints(&p, &vVertex[0], &vVertex[1], &vVertex[2]); //平面方程式の係数が法線の成分 pvNormal->x = p.a; pvNormal->y = p.b; pvNormal->z = p.c; return true; } return false;
}
////////////////////////////////////////////
///////////////////滑りベクトルの計算/////////////////////////
/*滑りベクトル
@D3DXVECTOR3 front //移動方向
D3DXVECTOR3 nomal //レイ判定で使われたpvNormalです
*/
D3DXVECTOR3 CalcWallScratchVector( D3DXVECTOR3 front, D3DXVECTOR3 nomal)
{
D3DXVECTOR3 out;
out =front-((D3DXVec3Dot(&nomal,&front))/(pow(D3DXVec3Length(&nomal),2)))*nomal; return out;
}
////////////////////////////////////////////
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。