鼠标拾取

yydaoxwj 2009-09-03 12:23:53
在游戏开场中,放四个mesh在x,z的四个方向,摄相机不断旋转
我想用鼠标来拾取其中一个mesh
但实现不了
高手指导下 <小弟用dx>
...全文
165 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gameice 2009-09-04
  • 打赏
  • 举报
回复
以上是对动态物体拾取的参考 比如 汽车 人物 等等

静态物体考虑的要少些
gameice 2009-09-04
  • 打赏
  • 举报
回复
if (m_MouseState.rgbButtons[0])
{
//获取客户区的坐标
POINT Pt={0,0};
GetCursorPos(&Pt);
ScreenToClient(m_hWnd,&Pt);

//计算射线
D3DVIEWPORT9 vp;
m_pDevice->GetViewport(&vp);
D3DXMATRIX proj;
m_pDevice->GetTransform(D3DTS_PROJECTION, &proj);
float px = ((( 2.0f*Pt.x) / vp.Width) - 1.0f) / proj(0, 0);
float py = (((-2.0f*Pt.y) / vp.Height) + 1.0f) / proj(1, 1);
Ray ray;
ray._origin = D3DXVECTOR3(0.0f, 0.0f, 0.0f);//这个0,0,0是视图空间下的,也就是世界空间下摄像机的位置
ray._direction = D3DXVECTOR3(px, py, 1.0f);
D3DXMATRIX matView,matInvView;
m_pDevice->GetTransform(D3DTS_VIEW,&matView);
D3DXMatrixInverse(&matInvView,0,&matView);
// transform the ray's origin, w = 1.
D3DXVec3TransformCoord(&ray._origin,&ray._origin,&matInvView);
// transform the ray's direction, w = 0.
D3DXVec3TransformNormal(&ray._direction,&ray._direction,&matInvView);
// normalize the direction
D3DXVec3Normalize(&ray._direction, &ray._direction);

BOOL hit;
DWORD index;
float tu,tv;
D3DXIntersect(m_pGround->GetMesh(),&ray._origin,&ray._direction,&hit,&index,&tu,&tv,NULL,NULL,NULL);

if(hit)
{
m_pGround->GetTerrainVertex(&vMouseCross,index,tu,tv);
m_bHeroMove=TRUE;
m_fCoeffient=0.0f;
}
}


//以下代码写在物体绘制之前

if(m_bHeroMove)
{

D3DXVECTOR3 vStartPos= m_pHero->m_vPos;//每次差值时候的起始位置,也就是上一次物体的位置

//求得开始点到结束点两点间的距离
float fTemp = sqrtf((vMouseCross.x-vStartPos.x)*(vMouseCross.x-vStartPos.x)
+(vMouseCross.z-vStartPos.z)*(vMouseCross.z-vStartPos.z));
if(m_fCoeffient >= 1.0)//这个1.0不能改变,改变之后拾取就不准确了
{
m_bHeroMove=FALSE;
m_fCoeffient=0.0f;
}
m_fCoeffient += 0.5f/fTemp;//这里的0.5能够控制球移动的快慢值越大,移动的越快
//根据两点间的距离算取移动的速度
D3DXVec3Lerp(&m_pHero->m_vPos,&vStartPos,&vMouseCross,m_fCoeffient);
m_pHero->SetAnimationName("walk");//让物体播放“走动”动作的函数
}
m_pHero->Render(fElapsedTime,m_pHero->m_vPos,1.0f,m_pHero->Rota);//在Render中绘制物体的那个函数


//在game.h中还需要定义如下的变量:

D3DXVECTOR3 vMouseCross;//相交点坐标
float m_fCoeffient;//差值参数
bool m_bHeroMove;//物体是否移动



//如果物体要考虑旋转问题:
float facetoface()
{
float angle=0.0f;

angle=atan((x2-x1)/(z2-z1));

if(x2-x1<=0.0f&&z2-z1<0.0f)
{
angle+=0.0f;
}

if(z2-z1>=0.0f&&x2-x1<0.0f)
{
angle += D3DX_PI;
}

if(z2-z1>0.0f&&x2-x1>=0.0f)
{
angle += D3DX_PI;
}

if(x2-x1>0.0f&&z2-z1<=0.0f)
{
angle += 2*(D3DX_PI);
}

return angle;
}
张赐 2009-09-03
  • 打赏
  • 举报
回复
这个例子就是拾取mesh的
张赐 2009-09-03
  • 打赏
  • 举报
回复
dx
picking的例子不是很多吗,dx自带的sdk就有一个
xingzhe2001 2009-09-03
  • 打赏
  • 举报
回复

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧