DirectX三维游戏开发,鼠标拾取编程案例源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DirectX三维游戏开发,鼠标拾取编程案例源代码
D3DXVECTOR3 A1,B1,C1,D1; //构成四边形平面的四个点
//A----B
//| / |
//| / |
//C----D
bool IsPick(long x,long y,IDirect3DVertexBuffer9* m_vertex_buffer)
{
D3DVIEWPORT9 viewport;
DXUTGetD3DDevice()->GetViewport(&viewport);
D3DXMATRIX proj_matrix;
DXUTGetD3DDevice()->GetTransform(D3DTS_PROJECTION, &proj_matrix);
float px = ((( 2.0f * x) / viewport.Width) - 1.0f) / proj_matrix(0, 0);
float py = (((-2.0f * y) / viewport.Height) + 1.0f) / proj_matrix(1, 1);
RAY ray;
ray.pos = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
ray.dir = D3DXVECTOR3(px, py, 1.0f);
D3DXMATRIX mat,matView,matWorld;
DXUTGetD3DDevice()->GetTransform(D3DTS_VIEW, &matView);
DXUTGetD3DDevice()->GetTransform(D3DTS_WORLD, &matWorld);
mat = matWorld * matView;
D3DXMatrixInverse(&mat,NULL,&mat);
// transform the ray's origin, w = 1.
D3DXVec3TransformCoord(&ray.pos, &ray.pos, &mat);
// transform the ray's direction, w = 0.
D3DXVec3TransformNormal(&ray.dir, &ray.dir, &mat);
// normalize the direction
D3DXVec3Normalize(&ray.dir, &ray.dir);
CUSTOMVERTEX* v;
m_vertex_buffer->Lock(0, 0, (void**)&v, 0);
D3DXVECTOR3 A,B,C,D;
A1.x=v[0].x;
A1.y=v[0].y;
A1.z=v[0].z;
B1.x=v[1].x;
B1.y=v[1].y;
B1.z=v[1].z;
C1.x=v[2].x;
C1.y=v[2].y;
C1.z=v[2].z;
D1.x=v[3].x;
D1.y=v[3].y;
D1.z=v[3].z;
A=B1;
B=D1;
C=A1;
D=C1;
//A----B
//| / |
//| / |
//C----D
/*int m_num_cells_per_col=2;
int m_num_cells_per_row=2;
int m_num_verts_per_row=2;
bool one=false;
bool two=false;*/
bool one=false;
bool two=false;
m_num_verts_per_row + col].y,v[row * m_num_verts_per_row + col].z);
// B = D3DXVECTOR3(v[row * m_num_verts_per_row + col + 1].x,v[row * m_num_verts_per_row + col + 1].y,v[row * m_num_verts_per_row + col + 1].z);
// C = D3DXVECTOR3(v[(row+1) * m_num_verts_per_row + col].x,v[(row+1) * m_num_verts_per_row + col].y,v[(row+1) * m_num_verts_per_row + col].z);
// D = D3DXVECTOR3(v[(row+1) * m_num_verts_per_row + col + 1].x,v[(row+1) * m_num_verts_per_row + col + 1].y,v[(row+1) * m_num_verts_per_row + col + 1].z);
float u1,v1,dist;
if (D3DXIntersectTri(&A,&B,&C,&ray.pos,&ray.dir,&u1,&v1,&dist)/* && dist>0.0f*/)
{
one=true;
m_point = A + (B-A)*u1 + (C-A)*v1; // m_point---拾取交点
}
if (D3DXIntersectTri(&C,&B,&D,&ray.pos,&ray.dir,&u1,&v1,&dist)/* && dist>0.0f*/)
{
two=true;
m_point = C + (B-C)*u1 + (D-C)*v1;
}
// }
//}
m_vertex_buffer->Unlock();
return (one || two);
}