DirectX三维游戏开发,鼠标拾取编程案例源代码

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

相关文档
最新文档