Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.07.2004, 18:23

D3DXIntersect

Hi

Ich möchte anhand der Mouse-Position die entsprechende 3D-Koordinate auf dem Modell bestimmen. Dazu scheint ja die Funktion D3DXIntersect geeignet.
Ich habe schon verschiedene Tutorials probiert, auch das der SDK, kriegs aber doch nicht auf die Reihe -> Liefert nie einen Hit zurück.

Hat jemand ein totsicheres Tutorial zur Hand oder kann mir einer sagen wie ich was machen muss.

Folgende Unklarheiten:
1: Welcher der Vectoren muss normalisiert werden ?
2: BackBufferWidth/height oder GetClientRect ?
3. Wie kann ich den ray am besten einzeichnen, um zu prüfen was ich da gerechnet habe ?


Besten Dank

Martin

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

28.07.2004, 23:20

ich hab noch nie so ein picking geproggt, aber afaik musst du erst mal einen strahl ausrechnen der von deinen 2d mauskoordinaten aus in das bild hinen zeigt. dann wäre es sicherlich zu empfehlen, diesen strahl mit der inversen projektions, sicht und weltmatrix zu multiplizieren und dann erst mit D3DXIntersect() ranzugehen...

ich hab mich mal kurz an backward raytracing versucht und hab für ein ähnliches problem die funktion D3DXVec3Unproject() verwendet, die genau das macht...

wie du den ray zeichnest!?

naja, du hast den startpunkt und die richtung...

ich würd eine recht lange linie zeichnen.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

28.07.2004, 23:25

Darf ich mal ganz doof fragen warum du dafür nit einfach eine linehittriangle funktion nutzt und als linie die pos der Kamera als den ausgangspunkt und den lookat vektor als richtungsvektor?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

28.07.2004, 23:42

naja, damit kann er elegant bestimmen auf welches polygon seines modells die kamera gerichtet ist ;)

so wie ich das verstanden hab, will er aber herausfinden auf welchem polygon sich sein mauszeiger gerade befindet...

LineHitTriangle funktion.
meinst du die der tribase engine!?

er hat nie gesagt dass er die verwendet.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

28.07.2004, 23:55

EIne vergleichbare funktion und ja ich habe vergessen die maus noch mit rein zu bringen :angel: . Man müsste dann also noch den richtugnsvektor anpassen...

6

29.07.2004, 08:10

Also falls jemand im code gerade einen fehler erkennt:

D3DXMATRIXA16 matProj;
m_pd3dDevice->GetTransform( D3DTS_PROJECTION, &matProj );

// Get mouse position in screen coordinates [0... Width/Height]
POINT ptCursor;
GetCursorPos( &ptCursor );
ScreenToClient( m_hWnd, &ptCursor );

RECT rect;
GetClientRect(this->m_hWnd, &rect);

// Transform to normalized coordinates [-1....1]
D3DXVECTOR3 v;
//v.x = ( ( ( 2.0f * ptCursor.x ) / m_d3dsdBackBuffer.Width ) - 1 ) / matProj._11;
//v.y = -( ( ( 2.0f * ptCursor.y ) / m_d3dsdBackBuffer.Height ) - 1 ) / matProj._22;
v.x = ( ( ( 2.0f * ptCursor.x ) / (rect.right-rect.left) ) - 1 ) / matProj._11;
v.y = -( ( ( 2.0f * ptCursor.y ) / (rect.bottom - rect.top) ) - 1 ) / matProj._22;
v.z = 1.0f;

// Get the inverse view matrix
D3DXMATRIXA16 matView, m;
m_pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
D3DXMatrixInverse( &m, NULL, &matView );

// Transform the screen space pick ray into 3D space
vPickRayDir.x = v.x*m._11 + v.y*m._21 + v.z*m._31;
vPickRayDir.y = v.x*m._12 + v.y*m._22 + v.z*m._32;
vPickRayDir.z = v.x*m._13 + v.y*m._23 + v.z*m._33;
//D3DXVec3Normalize(&vPickRayDir,&vPickRayDir);
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;


/*
* Determine intersection of the ray with the mesh
*/

D3DXMATRIX worldMatrix;
m_pd3dDevice->GetTransform(D3DTS_WORLD, &worldMatrix );

D3DXVECTOR3 vNear,vDir;
D3DXMATRIX invMat;
D3DXMatrixInverse(&invMat,NULL,&worldMatrix);
D3DXVec3TransformCoord(&vNear,&vPickRayOrig,&invMat);
D3DXVec3TransformNormal(&vDir,&vPickRayDir,&invMat);


// Get the picked triangle
LPD3DXBASEMESH pMesh = m_MeshModel.GetMesh();//m_pObject->GetLocalMesh();
LPDIRECT3DVERTEXBUFFER9 pVB;
LPDIRECT3DINDEXBUFFER9 pIB;

pMesh->GetVertexBuffer( &pVB );
pMesh->GetIndexBuffer( &pIB );


WORD* pIndices;
CUSTOMVERTEX* pVertices;

pIB->Lock( 0, 0, (void**)&pIndices, 0 );
pVB->Lock( 0, 0, (void**)&pVertices, 0 );

DWORD dwFace;
FLOAT fBary1, fBary2, fDist;
bool hit = false;

int error = D3DXIntersect(pMesh, &vPickRayOrig, &vPickRayDir, (int*)&hit, &dwFace, &fBary1, &fBary2, &fDist, NULL, NULL);
i

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

7

29.07.2004, 09:58

Welchen Ray willst Du zeichnen? Den vom Auge durch die Maus? Da sollte ein Punkt rauskommen.
"Games are algorithmic entertainment."

8

29.07.2004, 10:09

Ja, vom Auge durch den errechneten 3D-Punkt (oder eben Maus-Position).

Aber eigentlich möchte ich den Schnittpunkt mit dem mesh, aber eben :-((

Werbeanzeige