Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: SkyNetBCN en 30 de Septiembre de 2008, 07:48:57 PM

Título: D3DXIntersect
Publicado por: SkyNetBCN en 30 de Septiembre de 2008, 07:48:57 PM
Qué tal compañeros. Le he dado un montón de vueltas a esto, pero no consigo entender el resultado:

Basándome en el código del Tutorial de D3D llamado picking, intenté determinar si el usuario "clicaba" con el ratón en algún objeto de la escena, pero la función D3DXIntersect Siempre me retorna true!!  :grrr:. Por lo que he leído por ahí no debería haber mucho más misterio, pero bueno, copiaré el código por si alguien me puede echar una mano:


... // Declaración de variables ...

DXUTGetD3D9Device()->GetTransform( D3DTS_WORLD, &matWorld);
DXUTGetD3D9Device()->GetTransform( D3DTS_VIEW, &matView );
DXUTGetD3D9Device()->GetTransform( D3DTS_PROJECTION, &pmatProj );

GetCursorPos( &ptCursor );
ScreenToClient( DXUTGetHWND(), &ptCursor );
       
D3DXVECTOR3 v;
v.x = ( ( ( 2.0f * ptCursor.x ) / pd3dsdBackBuffer->Width ) - 1 ) / pmatProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / pd3dsdBackBuffer->Height ) - 1 ) / pmatProj._22;
v.z = 1.0f;

mWorldView = matWorld * matView;
D3DXMatrixInverse( &mInverse, NULL, &mWorldView );       

vPickRayDir.x = v.x * mInverse._11 + v.y * mInverse._21 + v.z * mInverse._31;
vPickRayDir.y = v.x * mInverse._12 + v.y * mInverse._22 + v.z * mInverse._32;
vPickRayDir.z = v.x * mInverse._13 + v.y * mInverse._23 + v.z * mInverse._33;
vPickRayOrig.x = mInverse._41;
vPickRayOrig.y = mInverse._42;
vPickRayOrig.z = mInverse._43;

D3DXIntersect( pMesh, &vPickRayOrig, &vPickRayDir, &bHit, NULL, NULL, NULL, &Distance, NULL, NULL );

if (bHit)
returnValue = true;


Creo que todo lo que hago es lo que se tiene que hacer, así que si alguien ve el error que yo no veo, se lo agradecería.

Un saludo!  ^_^'
Título: Re: D3DXIntersect
Publicado por: XÑA en 01 de Octubre de 2008, 09:27:48 AM
Mira yo uso este código para que me devuelva los puntos de inicio y fin

    /// <summary>
    /// Transform from Screen Coordinates to World Coordinates
    /// </summary>
    /// <param name="x">x in Screen Space</param>
    /// <param name="y">y in Screen Space</param>
    /// <param name="p0">first point of the segment in World Space</param>
    /// <param name="p1">second point of the segment in World Space</param>
   void CCamera::ScreenToWorld(int x, int y, Vector3dx *p0, Vector3dx *p1,D3DVIEWPORT9 *vp)
   {
      float fx = (float)x;
      float fy = (float)y;
      
      Matrix identity;
      
      D3DXMatrixIdentity(&identity);

      Vector3dx pos=this->Position;
      Vector3dx at=this->GetLook();
      D3DXVec3Unproject(p0,&Vector3dx(fx, fy, 0), vp, &m_Projection, &m_View, &identity);
      D3DXVec3Unproject(p1,&Vector3dx(fx, fy, 1), vp, &m_Projection, &m_View, &identity);
   }

Si tienes D3DXVec3Unproject, úsalo!! :)
Título: Re: D3DXIntersect
Publicado por: SkyNetBCN en 01 de Octubre de 2008, 03:46:50 PM
Pero he leído por ahí que la función D3DXVec3Unproject puede ser muy lenta, es eso cierto?