Archived

This topic is now archived and is closed to further replies.

haddar

please help about picking with mouse

Recommended Posts

actually it is pretty easy

you have a nearest and a farest clipping plane

in order to pick something with the mouse you need to recieve te mouse message (see MSDN for details) and get the 2d coordinates
they are included in the message

once you got these coordinates
you need to trace from your view origin into the direction of your viewangle

remember a player always has an
origin ( origin of the model)
vieworigin aka viewoffset the distance between origin and
vieworigin

angle (the direction your model is facing)
and
view angle (the direction the player`s view is facing to)

the viewangle consists of the following
viewangle[0]==pitch +=up -=down
viewangle[1]==yaw +=left -=right
viewangle[2]==roll not used very often it rotates the view around the axis you get by pitch and yaw

there is a function in the maths.h called anglevectors(....)

i hope that enough of explanation

Share this post


Link to post
Share on other sites
If you''re using OpenGL, look up gluPickMatrix and OpenGL''s selection buffer in Google or something...


Movie Quote of the Week:

"You''ve been eating retard sandwiches again."
- Birdman, Beautiful Girls.
Try http://uk.geocities.com/mentalmantle. Seriously. It''s brilliant.
And I just completely redesigned it so it looks even better.
DarkVertex Beta 0.8 available soon!

Share this post


Link to post
Share on other sites
Using D3D? Take a look at my code:


  

void DXEngine::SelectObject(int x, int y)
{
m_nSelObject = -1;

m_pkDevice->GetViewport(&m_pkViewPort);
m_pkDevice->GetTransform(D3DTS_WORLD, &m_kWorldMatrix);
m_pkDevice->GetTransform(D3DTS_PROJECTION, &m_kProjMatrix);
m_pkDevice->GetTransform(D3DTS_VIEW, &m_kViewMatrix);

D3DXVECTOR3 kMouse;
kMouse.x = x;
kMouse.y = y;

kMouse.z = 0;
D3DXVec3Unproject(&akSelectObjRayOut[0], &kMouse, &m_pkViewPort, &m_kProjMatrix, &m_kViewMatrix, &m_kWorldMatrix);

kMouse.z = 100;
D3DXVec3Unproject(&akSelectObjRayOut[1], &kMouse, &m_pkViewPort, &m_kProjMatrix, &m_kViewMatrix, &m_kWorldMatrix);

D3DXVECTOR3 p1, p2, p3;
D3DXVECTOR3 vIntersectionPoint;
D3DXPLANE plane;

for(int i=0; i<m_vkCloneList.size(); i++)
{
CLONE *pkClone = m_vkCloneList[i];

Object* pkObject = m_pkObjectManager->GetObj(
m_vkObjectList[pkClone->iObject]->strFileName);

if(pkObject)
{
pkObject->SetPos(
pkClone->kPos.x,
pkClone->kPos.y,
pkClone->kPos.z);

BoundingBox kBox = pkObject->GetBoundingBox();

D3DXVECTOR3 cube_corners[] =
{
D3DXVECTOR3( kBox.x_center-kBox.x_half_size, kBox.y_center-kBox.y_half_size, kBox.z_center-kBox.z_half_size), // 0 = bottom left near

D3DXVECTOR3( kBox.x_center-kBox.x_half_size, kBox.y_center+kBox.y_half_size, kBox.z_center-kBox.z_half_size), // 1 = top left near

D3DXVECTOR3( kBox.x_center+kBox.x_half_size, kBox.y_center+kBox.y_half_size, kBox.z_center-kBox.z_half_size), // 2 = top right near

D3DXVECTOR3( kBox.x_center+kBox.x_half_size, kBox.y_center-kBox.y_half_size, kBox.z_center-kBox.z_half_size), // 3 = bottom right near


D3DXVECTOR3( kBox.x_center-kBox.x_half_size, kBox.y_center-kBox.y_half_size, kBox.z_center+kBox.z_half_size), // 4 = bottom left far

D3DXVECTOR3( kBox.x_center-kBox.x_half_size, kBox.y_center+kBox.y_half_size, kBox.z_center+kBox.z_half_size), // 5 = top left far

D3DXVECTOR3( kBox.x_center+kBox.x_half_size, kBox.y_center+kBox.y_half_size, kBox.z_center+kBox.z_half_size), // 6 = top right far

D3DXVECTOR3( kBox.x_center+kBox.x_half_size, kBox.y_center-kBox.y_half_size, kBox.z_center+kBox.z_half_size) // 7 = bottom right far

};

int indices[36] =
{
0, 1, 2,
2, 3, 0,

3, 2, 6,
6, 7, 3,

1, 5, 2,
5, 6, 2,

4, 5, 1,
1, 0, 4,

7, 6, 5,
5, 4, 7,

4, 0, 3,
3, 7, 4
};

D3DXVECTOR3 pVertices[36];

for(int k=0; k<12; k++)
{
pVertices[k*3] = cube_corners[indices[k*3]];
pVertices[k*3+1] = cube_corners[indices[k*3+1]];
pVertices[k*3+2] = cube_corners[indices[k*3+2]];
}

const float fSens = 2.5f; //2.5f; // 1.25f


for(int j=0; j<12; j++)
{
p1 = pVertices[j*3];
p2 = pVertices[j*3+1];
p3 = pVertices[j*3+2];

D3DXPlaneFromPoints( &plane, &p1, &p2, &p3);
D3DXPlaneIntersectLine( &vIntersectionPoint, &plane,
&akSelectObjRayOut[0], &akSelectObjRayOut[1]);

D3DXVECTOR3 InterPtToCorner[3];

InterPtToCorner[0] = p1 - vIntersectionPoint;
InterPtToCorner[1] = p2 - vIntersectionPoint;
InterPtToCorner[2] = p3 - vIntersectionPoint;

if( fabs(InterPtToCorner[0].x) < fSens &&
fabs(InterPtToCorner[0].y) < fSens )
{
float kvot, angele_sum, div;

kvot = D3DXVec3Dot(&InterPtToCorner[1], &InterPtToCorner[0]);
div = (D3DXVec3Length(&InterPtToCorner[1]) * D3DXVec3Length(&InterPtToCorner[0]));
kvot /= div;
angele_sum = (float) SafeCos(kvot);

kvot = D3DXVec3Dot(&InterPtToCorner[1], &InterPtToCorner[2]);
div = (D3DXVec3Length(&InterPtToCorner[1]) * D3DXVec3Length(&InterPtToCorner[2]));
kvot /= div;
angele_sum += (float) SafeCos(kvot);

kvot = D3DXVec3Dot(&InterPtToCorner[2], &InterPtToCorner[0]);
div = (D3DXVec3Length(&InterPtToCorner[2]) * D3DXVec3Length(&InterPtToCorner[0]));
kvot /= div;
angele_sum += (float) SafeCos(kvot);

if(angele_sum > 6.28f && angele_sum < 6.29f)
{
m_nSelObject = i;
return;
}
}
}
}
}
}

Share this post


Link to post
Share on other sites