Cliquer sur un objet [D3D] - Programmation
Marsh Posté le 23-12-2001 à 03:14:36
une matrice de projection n'est pas inversible. comment veux-tu 'recréer' une nouvelle coordonnée à partir d'une projection sur un plan ?
méthode standard : construire un rayon dans le repère caméra. tu as le point d'origine, la distance au plan de projection, tu peux faire ça facilement. il doit même y avoir une méthode dans d3dx pour. (un rayon est un point + un vecteur de direction)
ensuite tu fais ta cuisine comme tu veux, ie tu transformes le rayon et la bbox dans le repère world et tu fais le test là, ou tu transformes le rayon dans le repère local de la bbox, etc.
Marsh Posté le 25-12-2001 à 21:19:54
j'crois que tu voulais aller voir
le sample "pick poly" du DXSDK.
t'as juste du te perdre en route
mais heureusement de bonnes ames
te remettent sur le droit chemin .
A+
LEGREG
Marsh Posté le 22-12-2001 à 23:19:09
J'ai essayé d'implémenter une fonction qui en prenant les coordonnées du curseur quand on clique sur la fenêtre, regardait si on cliquait sur un objet ou pas. Mais bon, ça marche pas et je pige pas pourquoi.
Donc, j'ai fais des bounding boxs dont je transforme les coordonnées avec la fonction D3DXVec3TransformCoord() en utilisant la matrice WORLD pour l'objet.
Le code de ma fonction:
bool CObject::ClickTouchOrNot(short x, short y) //x et y coords du curseur
{
D3DXMATRIX mProjection, mView;
g_lpD3DDevice->GetTransform(D3DTS_PROJECTION, &mProjection);
g_lpD3DDevice->GetTransform(D3DTS_VIEW, &mView);
D3DXMatrixInverse(&mProjection, NULL, &mProjection);
D3DXMatrixInverse(&mView, NULL, &mView);
D3DXVECTOR3 vPosition = D3DXVECTOR3(x, y, 0);
D3DXVECTOR3 vDirection = D3DXVECTOR3(0, 0, 1);
D3DXVec3TransformCoord(&vPosition, &vPosition, &mProjection);
D3DXVec3TransformCoord(&vDirection, &vDirection, &mProjection);
D3DXVec3TransformCoord(&vPosition, &vPosition, &mView);
D3DXVec3TransformCoord(&vDirection, &vDirection, &mView);
bool touch = D3DXBoxBoundProbe( &m_vBoundingBoxMin, &m_vBoundingBoxMax,
&vPosition, &vDirection);
return touch;
}