Avatar billede benjamin_ Nybegynder
11. april 2003 - 08:56 Der 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).

JPK >> er dette noget du har check på?


- benjamin
Avatar billede jpk Nybegynder
11. april 2003 - 09:01 #1
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..?
Avatar billede benjamin_ Nybegynder
11. april 2003 - 09:11 #2
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..


- benjamin
Avatar billede jpk Nybegynder
11. april 2003 - 09:31 #3
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?
Avatar billede benjamin_ Nybegynder
11. april 2003 - 09:34 #4
jeg er interesseret i at finde det hjørne som er tættest på musepointeren visuelt (i 2d) på skærmen..

- benjamin
Avatar billede jpk Nybegynder
11. april 2003 - 09:38 #5
Hvilket må være det samme punkt som er nærmest din pickray?
Avatar billede benjamin_ Nybegynder
11. april 2003 - 10:28 #6
afstanden fra pickray skæringspunktet i 3d er vel forskelligt hvis man så det i 2d ikke ?
Avatar billede jpk Nybegynder
11. april 2003 - 10:34 #7
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.
Avatar billede benjamin_ Nybegynder
11. april 2003 - 10:56 #8
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..

- benjamin
Avatar billede jpk Nybegynder
11. april 2003 - 11:06 #9
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.
Avatar billede jpk Nybegynder
11. april 2003 - 11:08 #10
Du skal IKKE bare bruge x,y koordinaterne for hjørnerne.
(Så vil det iøvrigt heller ikke virke hvis du ændrer eyepoint betydeligt)
Avatar billede benjamin_ Nybegynder
11. april 2003 - 12:01 #11
"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 ?


- benjamin
Avatar billede jpk Nybegynder
11. april 2003 - 12:09 #12
Nej, du regner da heller ikke 3-kantens koordinater om til 2D for at se om pickray'en skærer den..?
Avatar billede benjamin_ Nybegynder
14. april 2003 - 10:08 #13
Men lad os nu sige at jeg bare skal have et 2d koordinat ud af et 3d koordinat..  hvad gør jeg så?

- benjamin
Avatar billede benjamin_ Nybegynder
15. april 2003 - 09:14 #14
har fundet en løsning selv.
tak for hjælpen
Avatar billede jpk Nybegynder
02. maj 2003 - 14:31 #15
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]];

Med:
int closestVertex = 0;
if(PickDist(&vPickRayOrig, &vPickRayDir, &vThisTri[1]) < PickDist(&vPickRayOrig, &vPickRayDir, &vThisTri[closestVertex]))
    closestVertex=1;
if(PickDist(&vPickRayOrig, &vPickRayDir, &vThisTri[2]) < PickDist(&vPickRayOrig, &vPickRayDir, &vThisTri[closestVertex]))
    closestVertex=2;
if(PickDist(&vPickRayOrig, &vPickRayDir, &vThisTri[closestVertex]) < PickDist(&vPickRayOrig, &vPickRayDir, &m_vClosestVertex))
    m_vClosestVertex = vThisTri[closestVertex];

Hvor m_vClosestVertex er en membervariabel af typen D3DVERTEX
Avatar billede jpk Nybegynder
08. maj 2003 - 10:00 #16
Hvilken løsning brugte du?
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester