Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





D3DXIntersect

Iniciado por SkyNetBCN, 30 de Septiembre de 2008, 07:48:57 PM

« anterior - próximo »

SkyNetBCN

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!  ^_^'

XÑA

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!! :)

SkyNetBCN

Pero he leído por ahí que la función D3DXVec3Unproject puede ser muy lenta, es eso cierto?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.