首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

D3D地型碰撞捡测有关问题

2012-09-20 
D3D地型碰撞捡测问题BOOL CModel::penzhuang(D3DXVECTOR3 startxyz,D3DXVECTOR3 endxyz,float *Length){BO

D3D地型碰撞捡测问题
BOOL CModel::penzhuang(D3DXVECTOR3 startxyz,D3DXVECTOR3 endxyz,float *Length){
BOOL Hit;
float u, v, Dist;
DWORD FaceIndex;
D3DXVECTOR3 vecDir,SubXYZ,startXYZ,endXYZ;
startXYZ=startxyz;
startXYZ.y=0;
endXYZ=endxyz;
endXYZ.y=0;
SubXYZ=endXYZ-startXYZ;
D3DXVec3Normalize(&vecDir, &SubXYZ);


int objnum=m_obj.size();
for (int i=0;i<objnum;i++)
{
if (m_obj.at(i).m_mesh_type !=0 && m_obj.at(i).m_object_id !=0)
{

int Type=m_model.m_obj.at(i).m_mesh_type;
int Id=m_model.m_obj.at(i).m_mesh_id;

D3DXIntersect(m_model.m_mesh[Type].at(Id).m_mesh,&startXYZ,&vecDir,&Hit,&FaceIndex, &u, &v, &Dist,NULL,NULL);
if (Hit )
{
if (Dist < 30)
{
*Length=Dist;
Hit = TRUE;
}else{
Hit=FALSE;
}
break;
}
}
}
if (objnum==1)
{
Hit= FALSE;
}
return Hit;
}

我用主角当前坐标向目的地坐标发射一条射线.然后做地型上的模型做碰撞捡测. 结果模型移开了.就捡测不了.

我就是想到了平移.那矩阵也会变化.

就加了下面的代码.结果还是不行.

D3DXMATRIX matWord,mrotX,mrotY,mrotZ,mSac,m,wordview,xyz;

D3DXMatrixRotationX(&mrotX,m_obj.at(i).m_rotation_x);
D3DXMatrixRotationY(&mrotY,m_obj.at(i).m_rotation_y);
D3DXMatrixRotationZ(&mrotZ,m_obj.at(i).m_rotation_z);
D3DXMatrixScaling(&mSac,m_obj.at(i).m_scal_x,m_obj.at(i).m_scal_y,m_obj.at(i).m_scal_z);
D3DXMatrixTranslation(&matWord,m_obj.at(i).m_xyz.x,m_obj.at(i).m_xyz.y,m_obj.at(i).m_xyz.z);
wordview=mrotX*mrotY*mrotZ*mSac*matWord;
m_d3d.g_pd3dDevice->SetTransform(D3DTS_WORLD,&(wordview));
D3DXMatrixInverse(&m,NULL,&wordview);

求出模型在世界矩阵的逆矩阵
D3DXMATRIX matWord1;
D3DXMatrixTranslation(&matWord1,startXYZ.x,startXYZ.y,startXYZ.z);
matWord1=matWord1*m;
m_d3d.g_pd3dDevice->SetTransform(D3DTS_WORLD,&(matWord1));
然后目标点乘逆距阵....简单的讲一下

就是求出模型在世界矩阵的逆矩阵m
然后我把射线起点也做了一次平移得到矩阵.然后乘逆矩阵.再放到世界距阵中

但是方向怎么办.

可能我这样写错了...有没有高手指点一下.怎么去写.让这个射线乘这个逆矩阵..还有怎么求方向....

求解......

[解决办法]
对于简单的场景,你可以简单地遍历下所有物体,看射线击中了谁的包围球或者包围盒,然后把击中的物体再逐个遍历下看到底击中哪个三角形。

对于复杂场景,你可以把物体管理起来,分区放置,或者树型放置,然后射线变成一段一段的线段来碰撞。
某个区块的线段就只检测某个区的物体。。
这样就可以了,所有碰撞可以都在世界坐标系下进行,这样比较直观。

另外,对于复杂场景的碰撞,其实比较发烦的,你可以查下相关资料,凭空想不好想。
[解决办法]
射线放到原点
那所有物体必须乘以摄影机的view矩阵.

你可以所有物体都按世界坐标世界矩阵来

热点排行