11. april 2003 - 08:56Der er
15 kommentarer og 1 løsning
fra 3d koordinat til 2d koordinat
Jeg arbejder med Direct3D 8.1. Og jeg vil gerne kunne transformere et 3d koordinat om til et 2d(skærm)-koordinat. Dette er et koordinat som skal bruge til nogle afstands beregninger.
Jeg er godt klar over at Direct3D selv sørger for at lave dem om til 2d men jeg er interesseret i at få adgang til denne værdi (og det skal helst ikke bruge for megen processorkraft).
Du kan ikke "få adgang" til værdierne, men du kan naturligvis selv beregne dem. Men jeg ville da gerne vide lidt mere om hvad du vil opnå med det, for måske er der en anden måde..?
Du kender til raypick ikke? Jeg bruger den til at finde ud af hvilken trekant min musepointer befinder sig i. Dernæst vil jeg gerne finde ud hvilket hjørne af trekanten min musepointer er nærmest. Til dette skal jeg jo bruge et 2d koordinat som det på skærmen. Hvis jeg bruger et 3d koordinat vil afstanden fra musepointeren (omregnet til 3d-skæringspunkt med trekantens plan) være en afstand som er i firhold til 3d. Derfor ser resultatet helt #&#&#¤(%/ ud.. Og det er derfor jeg vil bruge det transformerede 2d koordinat..
Er du sikker på at det du vil er "finde ud hvilket hjørne af trekanten min musepointer er nærmest"? Er det ikke at finde det hjørne pickray'en er nærmest?
Jeg vil mene at afstanden mellem skæringspunktet for pickray og trekant til et af trekantens hjørner er proportional med den 2-dimensionale afstand mellem pointer og hjørne.
når jeg kører musen hen over trekanter siger den for eksempel at jeg er midt mellem punkt 1 og punkt 2 i trekanten.. Men man sagtens se at musen befinder sig oppe halvejs i punkt 1's halvdel.. Og det er fordi at punkt1's z-værdi ligger MEGET længere væk end punkt2's..
Du skal bruge SKÆRINGSPUNKTET mellem trekanten og pickray'en. Hvis du beregner afstanden mellem trekantens hjørner og skæringspunktet burde problemet være løst.
"Du skal bruge SKÆRINGSPUNKTET mellem trekanten og pickray'en. Hvis du beregner afstanden mellem trekantens hjørner og skæringspunktet burde problemet være løst."
Men skæringspunktet og trekantens hjørnepunkter skal da være 2d-skærmkoordinater for at jeg kan finde afstanden imellem dem med respekt til 2d-viewet på skærmen.. ikke ?
Hvordan har du løst det? Jeg har lige prøvet følgende, det ser ud til at virke...
Jeg har tilføjet denne metode FLOAT CMyD3DApplication::PickDist(D3DXVECTOR3* pvPickRayOrig, D3DXVECTOR3* pvPickRayDir, D3DVERTEX* pVertex) { D3DXVECTOR3 PoP = *(D3DXVECTOR3*)&pVertex->p - *pvPickRayOrig; D3DXVECTOR3 vCross; return D3DXVec3Length(D3DXVec3Cross(&vCross, pvPickRayDir, &PoP)) / D3DXVec3Length(pvPickRayDir); }
Som jeg kalder fra Pick() i eksemplet efter koden: // get vertices hit vThisTri[0] = pVertices[iThisTri[0]]; vThisTri[1] = pVertices[iThisTri[1]]; vThisTri[2] = pVertices[iThisTri[2]];
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.