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

HDieterH

Frischling

  • »HDieterH« ist der Autor dieses Themas

Beiträge: 16

Wohnort: Düsseldorf

  • Private Nachricht senden

1

17.03.2003, 09:14

Meshkoordinaten

Hallo, wie bitte erhalte ich die Meshkoordinaten für meine Mouse?

Ich lade mein Mesh ( ein xFile ) und sehe es auf dem Bildschirm ... ich Transformiere es und das klappt alles wunderbar. Nur weiss ich nie wo mein Mesh gerade auf dem Monitor iss :-(

(POINT) mMousePos.x, mMousePos.y

Den Screen frage ich mit GetCursorPos im Vollbild ( 640/480) ab, nun möchte ich eine Formel haben ( wenn es sowas gibt ) um mein Mesh mit der Mouse zu finden.

Oder anders:
D3DXVECTOR3 vTranslate;
vTranslate.x = 0.1f; // iss aber nicht = 1 Pixel also mMouse += 1 geht nicht
D3DXMatrixTranslation(&mTranslate, vTranslate.x, vTranslate.y, vTranslate.z );

MFG, Dieter
Anfänger -> Braucht immer Hilfe :-(

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

17.03.2003, 09:47

Verstehe ich das richtig, dass Du die Bildschirmkoordinaten eines 3D-Punkts (in diesem Fall: die Position des Meshs) berechnen möchtest?
Dazu transformierst Du den Positionsvektor erst mit der Weltmatrix (also die, die Du für D3DTS_WORLD setzt), dann mit der Sichtmatrix (D3DTS_VIEW) und dann mit der Projektionsmatrix (D3DTS_PROJECTION).
Danach musst Du den resultierenden Vektor noch umrechnen:

vVector.x = (vVector.x - 320.0f) * 2.0f;
vVector.y = (vVector.y - 240.0f) * -2.0f;

So müsste es gehen, bei 640x480.

HDieterH

Frischling

  • »HDieterH« ist der Autor dieses Themas

Beiträge: 16

Wohnort: Düsseldorf

  • Private Nachricht senden

3

17.03.2003, 10:52

??? Sorry, ich verstehe das nicht richtig.

1. Mein Mesh ist ja nicht nur ein Punkt
2. D3dDevice->Transform(D3DTS_WORLD,&vVector) gibt es nicht :-(
3. D3dDevice->SetTransorm will eine Matrix und keinen Vector

Bitte um Verständnis, ich bin Anfänger !
Anfänger -> Braucht immer Hilfe :-(

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

17.03.2003, 10:54

Schon klar, dass ein Mesh kein Punkt ist! Aber Du wolltest doch die Position auf dem Bildschirm, oder nicht?

IDirect3DDevice9::Transform gibt es nicht, benutze die Funktion D3DXVec3TransformCoord. Die Matrizen kriegst Du mit IDirect3DDevice9::GetTransform. Schau Dir auch mal die Funktion D3DXVec3Project an, die macht genau das.
Dann kannst Du ja die Entfernung zwischen Mauszeiger und der Position des Meshes berechnen und wenn die z.B. kleiner als 50 ist, dann heißt das, dass die Maus über dem Mesh ist.

HDieterH

Frischling

  • »HDieterH« ist der Autor dieses Themas

Beiträge: 16

Wohnort: Düsseldorf

  • Private Nachricht senden

5

17.03.2003, 13:12

Meine Karte auf dem Bildschirm mit den Screenkoordinaten:

***** diese Koordinaten habe ich nicht, aber ich möchte sie ****
mesh.left 30
mesh.width 50
mesh.top 20
mesh.height 100
******************************************************

Dann könnte ich abfragen:

POINT mMousePos;
GetCursorPos(&mMousePos);

BOOL bTreffer = FALSE;
if (mMousePos.x > 30 && mMousePos.x < 80 && mMousePos.y > 20 && mMousePos.y < 120)
bTreffer = TRUE;
else
bTreffer = FALSE;


if (bTreffer)
mesh.render(transparent)
else
mesh.render(normal);

jetzt verschiebe ich das Mesh um 0.1f nach links

Wie finde ich es wieder, ich schäme mich schon langsam hier zu fragen, aber ich verstehe es nicht.

Du hast gesagt: ( Wenn ich es richtig verstanden habe )

D3DXVECTOR3 lVector;
D3DVIEWPORT8 lViewport;
D3DXMATRIX lProjectionMatrix;
D3DXMATRIX lViewMatrix;
D3DXMATRIX lWorldMatrix;

fD3dDevice->GetViewport(&lViewport);
fD3dDevice->GetTransform(D3DTS_WORLD,&lWorldMatrix);
fD3dDevice->GetTransform(D3DTS_VIEW,&lViewMatrix);
fD3dDevice->GetTransform(D3DTS_PROJECTION,&lProjectionMatrix);

D3DXVec3TransformCoord(&lVector,&lVector,&lWorldMatrix);
D3DXVec3TransformCoord(&lVector,&lVector,&lViewMatrix);
D3DXVec3TransformCoord(&lVector,&lVector,&lProjectionMatrix);

D3DXVec3Project(
&lVector,
&lVector,
&lViewport,
&lProjectionMatrix,
&lViewMatrix,
&lWorldMatrix);

Wie bekomme ich denn jetzt meine Koordinaten ?

mesh.left = ?
mesh.width = ?
mesh.top = ?
mesh.height = ?

Bitte entschuldige meine Dummheit :wall:

MFG, Dieter
Anfänger -> Braucht immer Hilfe :-(

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

17.03.2003, 16:44

Das ist doch keine Dummheit! Dafür ist das Forum ja da, dass man Fragen stellt! :)
Das sieht schonmal gut aus. Aber wenn Du D3DXVec3Project verwendest, brauchst Du die anderen Transformationen mit D3DXVec3TransformCoord nicht mehr durchzuführen. D3DXVec3Project alleine reicht schon und es liefert Dir dann die Bildschirmkoordinaten im Ausgabevektor.

HDieterH

Frischling

  • »HDieterH« ist der Autor dieses Themas

Beiträge: 16

Wohnort: Düsseldorf

  • Private Nachricht senden

7

17.03.2003, 18:10

Sieht vielleicht nicht schlecht aus, bringt mich aber nicht wirklich weiter ....

D3DXVECTOR3 lVector;
D3DVIEWPORT8 lViewport;
D3DXMATRIX lProjectionMatrix;
D3DXMATRIX lViewMatrix;
D3DXMATRIX lWorldMatrix;

fD3dDevice->GetViewport(&lViewport);
fD3dDevice->GetTransform(D3DTS_WORLD,&lWorldMatrix);
fD3dDevice->GetTransform(D3DTS_VIEW,&lViewMatrix);
fD3dDevice->GetTransform(D3DTS_PROJECTION,&lProjectionMatrix);

D3DXVec3Project(
&lVector, // hier benutze ich 2 mal den selben D3DXVECTOR3
&lVector, // und hier: ist das falsch ?
&lViewport,
&lProjectionMatrix,
&lViewMatrix,
&lWorldMatrix);

Jetzt habe ich also im lVector.x meine xKoordinate und im lVector.y meine yKoordinate.

Und was habe ich jetzt von einem PUNKT um Raum ? Oder kann ein D3DXVECTOR3 noch mehr als mir einen Punkt im Raum liefern ?

Bitte noch ein wenig Verständnis für einen Neuling.
Anfänger -> Braucht immer Hilfe :-(

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

17.03.2003, 18:57

Jetzt hast Du die Position des Meshes auf dem Bildschirm. Genauer gesagt: die Position des Mittelpunkts vom Mesh. Jetzt kannst Du die Entfernung zwischen Mauszeiger und diesem Punkt berechnen (Satz des Pythagoras!). Dann könntest Du z.B. sagen: wenn der Abstand kleiner als 100 Pixel ist, dann ist das Objekt ausgewählt. Du könntest diesen Radius ja auch von der Tiefe des Objekts abhängig machen, also von der Entfernung zur Kamera. Wenn das Objekt dann nah dran ist, könnte der Radius 200 Pixel sein und wenn es weit weg ist, vielleicht nur 10 oder so.

Werbeanzeige