[ MiG29 @ 13.10.2005. 00:55 ] @
Bezuspesno sam trazio na netu primer kako da u Direct3D sceni kada kliknem misem na objekat, dobijem informaciju koji je objekat "selektovan".

Molim Vas da mi pomognete. Da li postoji neka funkcija ili je nesto drugo.
[ bkaradzic @ 13.10.2005. 01:02 ] @
Citat:
Article on Mouse Picking - 04/06/05

There comes a time in every 3D game where the user needs to click on something in the scene. Maybe he needs to select a unit in an RTS, or open a door in an RPG, or delete some geometry in a level editing tool. This conceptually simple task is easy to screw up since there are so many little steps that can go wrong. I've written an article on this subject, however it's in PDF form since it's pretty heavy on the math notation.

http://www.bookofhook.com/Article/GameDevelopment/mousepick.pdf
[ sucur @ 13.10.2005. 06:22 ] @
Ej ako neko zna rjesenje iste stvari u openGL ?
[ bkaradzic @ 13.10.2005. 06:54 ] @
LOL! Nisi ni pogledao PDF dokument...
[ sucur @ 13.10.2005. 12:49 ] @
Ma na dialu sam, pa nemam para da downloadujem ne provjerene stvari, jer znate svi kako je kada skdate nesto duze vrijeme, i nakon toga nije to ono sto vam treba ...
[ SashaX @ 13.10.2005. 13:45 ] @
To je 100kb, oko 20-ak sekundi maximalno preko dial-up-a

[Ovu poruku je menjao SashaX dana 13.10.2005. u 14:46 GMT+1]
[ sucur @ 13.10.2005. 18:34 ] @
Kazem ti nemam para, da provjeravam ono u sta nisam siguran, tj. radije cu fino pitati, pa kad neko kaze to je to onda ga skinem, a ne da skidam sve redom sa stranice, dok eventualno nenadjem ono pravo, u ovom slucaju je to jedan link, al' eto ...
[ MiG29 @ 14.10.2005. 00:25 ] @
Kakvi ste carevi :) Hvala puno :)
[ Dejan Mitrovic @ 20.02.2006. 23:20 ] @
Evo i koda za "buduca pokoljenja". Davno sam ovo pisao tako da mi sad i nije bas sve jasno, ali radi (verovatno je opisano u tom pdf-u, zvuci mi jako poznato)

Code:
// informations about the intersection between picking ray and mesh
struct INTERSECTION {
  // face in the mesh
  DWORD dwFace;
  // distance
  float fDist;
  // barycentric coordinates
  float fBary1, fBary2;
  // position of intersection
  D3DXVECTOR3 vPos;
};

bool CMyObject::IsClicked(int nMouseX, int nMouseY, int nWidth, int nHeight, INTERSECTION* pIntersection) {
  // transform the screen into the world coordinates
  D3DXMATRIX mxTemp;
  m_pD3DDevice->GetTransform(D3DTS_PROJECTION, &mxTemp);
  float fNear = - mxTemp._43 / mxTemp._33;
  float fNewX = (2.0f * nMouseX / nWidth - 1) / mxTemp._11;
  float fNewY = -(2.0f * nMouseY / nHeight - 1) / mxTemp._22;

  // calculate the inverse of the object's world transformation matrix
  D3DXMATRIX mxInvWorld;
  D3DXMatrixInverse(&mxInvWorld, NULL, &m_mxWorld);
  // calculate the inverse of the view transformation matrix
  D3DXMATRIX mxInvView;
  m_pD3DDevice->GetTransform(D3DTS_VIEW, &mxTemp);
  memcpy(&mxInvView, &mxTemp, sizeof(D3DXMATRIX));
  D3DXMatrixInverse(&mxInvView, NULL, &mxInvView);

  // calculate the ray direction vector
  D3DXVECTOR3 vRayDir;
  vRayDir.x = fNewX * mxInvView._11 + fNewY * mxInvView._21 + fNear * mxInvView._31;
  vRayDir.y = fNewX * mxInvView._12 + fNewY * mxInvView._22 + fNear * mxInvView._32;
  vRayDir.z = fNewX * mxInvView._13 + fNewY * mxInvView._23 + fNear * mxInvView._33;
  D3DXVec3Normalize(&vRayDir, &vRayDir);
  // we must rememeber this direction, before transforming it into object's space
  D3DXVECTOR3 vOldDir;
  memcpy(&vOldDir, &vRayDir, sizeof(D3DXVECTOR3));
  // transform the direction vector
  D3DXVec3TransformNormal(&vRayDir, &vRayDir, &mxInvWorld);

  // calculate the ray position vector
  D3DXVECTOR3 vRayPos = D3DXVECTOR3(mxInvView._41, mxInvView._42, mxInvView._43);
  // we must remember this vector, before transforming it into object's space
  pIntersection->vPos = vRayPos;
  // transform the position vector (transform coordinates of this point)
  D3DXVec3TransformCoord(&vRayPos, &vRayPos, &mxInvWorld);

  BOOL bHit;
  // check to see if the ray intersects the mesh
  D3DXIntersect(m_pMesh, &vRayPos, &vRayDir, &bHit, &pIntersection->dwFace, &pIntersection->fBary1,
    &pIntersection->fBary2, &pIntersection->fDist, NULL, NULL);
  if (bHit) {
    D3DXVec3Scale(&vOldDir, &vOldDir, pIntersection->fDist);
    D3DXVec3Add(&pIntersection->vPos, &pIntersection->vPos, &vOldDir);
  }
  return bHit;
}
[ djordje @ 24.02.2006. 10:28 ] @
Citat:
Kazem ti nemam para, da provjeravam ono u sta nisam siguran


Vise ti je vremena trebalo fda napises ova dva posta, nemoj da se izvlacis
[ sucur @ 24.02.2006. 12:57 ] @
Eh Djordje ne citas sve ... Rekao sam da nemam para da skidam sve sto se postavi na stranici tj. radije cu pitati pa cekati potvrdu da se u tom i tom fajlu nalazi ono sto mi treba, nego skidati dakle sve.
[ djordje @ 24.02.2006. 14:09 ] @
pricamo o konkretnom fajlu od 100k koji mozes da skines dosta brzo. Procitao sam sve
[ genuine @ 14.07.2006. 17:20 ] @
Aman bre sto komplikujete.. u OpenGL je uradjeno tako sto svaki objekat predas opengl-u sa sa odgovarajucim ID-om . zatim postavis frustum da bude veoma uzak i izrendiras scenu i opengl ti vrati spisak svih objekata koji se nalaze u frustum-u.. sada mozes proizvoljno da biras koji ti treba ili prirodno koji je najblizi..

pozdrav.
[ tosa @ 15.07.2006. 02:35 ] @
"Komplikujemo" zbog brzine tražene operacije. Metod koji si ti opisao je horror što se tiče brzine.
[ genuine @ 15.07.2006. 14:38 ] @
onda ovako.. svaki objekat ima svoj bounding volume ( bilo box, sphere ili sta vec) kada radite ispitivanje preseka onda prvo eliminisete sve koje mozete koristeci negi algoritam ... a za one potencijalne uradite proveru preseka sa zrakom.. ako nema preseka sa bounding volume onda nema ni sa objektom a ako ima onda udjete u hijerarhiju objeta i ispitujete preseke na sledecem nivou ( znaci preseci bounding volume-a ruke, noge, krila , tocka i sl i zraka ) .. postupak se ponavlja sve dok se ne dodje do listova u hijararhiji.... kada se stigne do njih testiranje se nastavlja ispitivanjem preseka zraka i trouglova.... svi objekti ( bilo koreni ili neki u stablu hijararhije) sa kojima postoji potencijalni presek se stavljaju u red i algoritam cupa prvi iz reda i nastavlja testiranje.. ako nadje nekoliko mogucnosti onda njih doda u red i tako redom...



[Ovu poruku je menjao genuine dana 15.07.2006. u 15:49 GMT+1]

[Ovu poruku je menjao genuine dana 15.07.2006. u 15:49 GMT+1]