wie kann ich 3d koordinaten in 2dMouse koordinaten umrechnen ?



  • Hallo, kann mit bitte einer erklähren wie ich mein im Raum befindliches Object mit der Mouse auf dem Screen wiederfinde ?

    Beispiel:
    Ich habe ein Mesh ( als Spielkarte ) auf dem Screen. Nun möchte ich wenn die Mouse darüberfährt ( die ich mit GetCursorPos abfrage ) die Karte mit Renderstates ( Transparent ) anzeigen. Nur wie bekomme ich die Mousekoordinaten von 3D auf 2D ( eigentlich ja mit D3DXVec3Project ) und wie errechne ich dann die Breite/Hoehe meiner Karte ?

    MFG, Dieter



  • Hey Dieter, kann es sein, dass Du die Frage schonmal in meinem Forum gestellt hast (als "HDieterH")? Ich denke schon! Ich habe Dir da doch alles gesagt. Kannst ruhig nochmal nachfragen, wenn Du was nicht verstanden hast.
    Ich meine diesen Thread hier: http://www.scherfgen-software.de/forum/viewtopic.php?t=113

    Wenn Du die Breite und die Höhe noch haben willst, dann solltest Du jeden Vertex durchgehen, den projizieren und dann die minimale/maximale Koordinate auf der x- und y-Achse berechnen. Dann hast Du das Rechteck, in dem sich das Objekt auf dem Bildschirm befindet. Könnte auch mit Bounding-Boxes gehen...

    [ Dieser Beitrag wurde am 18.03.2003 um 21:16 Uhr von TomasRiker editiert. ]



  • Schau mal in der FAQ 🙂



  • @ TomasRiker
    Ja, habe ich.
    Leider habe ich das nicht verstanden und so bleibt mir nichts anderes übrig als weiter zu fragen. Da ich auf Deinen Seiten schon sehr viel gefragt habe dachte ich mir einfach, es woanders auch zu versuchen. Kann ja auch sein das ich es nicht verstehe weil ich nicht genügend vorkentnisse habe?!
    Und meine Hoffnung ist auch ein bisschen Code, den ich vielleicht irgendwann mal bekomme, entweder fällt es mir dann wie Schuppen von den Augen oder nicht, dann bleibt mir immer noch die Grundkentnisse zu erweitern.

    @Headhunter
    Mache ich.

    MFG, Dieter

    [ Dieser Beitrag wurde am 18.03.2003 um 21:34 Uhr von HDieterH editiert. ]



  • Du kannst ruhig so viel fragen wie Du willst 😉
    Also, eigentlich ist es nicht so schwer. Du kennst doch nun die Position des Objekts auf dem Bildschirm. Und Du kennst auch die Cursorposition (Mauszeiger). Wenn Du jetzt wissen willst, ob die Maus auf dem Objekt ist, dann gibt es einen einfachen Weg (der natürlich nicht perfekt ist):
    Du berechnest die Entfernung zwischen dieser Objektposition auf dem Bildschirm und dem Mauszeiger. Das geht mit dem Satz des Pythagoras. Dann kannst Du eine maximale Entfernung festlegen: wenn die Entfernung zwischen Mauszeiger und Objekt also zu groß ist, dann nimmt das Programm an, dass die Maus nicht auf dem Objekt ist.
    Die Entfernung muss also kleiner als die maximale Entfernung sein. Diese maximale Entfernung kannst Du von der Tiefe und der allgemeinen Größe des Objekts abhängig machen.



  • Du kannst ruhig so viel fragen wie Du willst
    <<<<
    Danke

    Also, eigentlich ist es nicht so schwer.
    <<<<
    Für mich schon

    Du kennst doch nun die Position des Objekts auf dem Bildschirm.
    <<<<
    Nein, kenne ich nicht ... mit dem was Du mir gezeigt hast bekomme ich zwar einen Vector und wenn ich es richtig verstanden habe, dann habe ich jetzt genau die MITTE meiner Karte, aber wenn ich dann meine karte aus dem Fenster verschiebe, dass heisst, eigentlich müsste ich jetzt einen Negativen Vector.x Wert haben, bleibt immer ein Rest von Vector.x > +25.

    Und Du kennst auch die Cursorposition (Mauszeiger).
    <<<<
    Ja, die kenne ich

    Wenn Du jetzt wissen willst, ob die Maus auf dem Objekt ist, dann gibt es einen einfachen Weg (der natürlich nicht perfekt ist):
    Du berechnest die Entfernung zwischen dieser Objektposition auf dem Bildschirm und dem Mauszeiger. Das geht mit dem Satz des Pythagoras.
    <<<<
    a²+b²=c² ?

    Hmm, ich möchte wenn die Mouse über meiner Karte ist, die Karte einfach z.B. Rot einfärben. ( Hast Du mir ja schon gezeigt, Stichwort: Renderstate )

    MFG, Dieter



  • Nur mal so eine Frage: bei D3DXVec3Project muss man ja einen D3DVIEWPORT9 angeben. Hast Du den auch schön vorher mit IDirect3DDevice9::GetViewport abgefragt? Vielleicht liegt es daran, dass die Koordinaten nicht stimmen.

    Ja, mit dem Satz des Pythagoras kann man die Entfernung zwischen zwei Punkten berechnen.

    Eine exakte Lösung für Dein Problem ist sehr aufwändig. Da müsstest Du erstmal an die ganzen Dreiecke des Meshes kommen und dann einen 3D-Strahl erstellen, der in die Szene "hineingeschossen" wird (dahin, wohin der Mauszeiger zeigt). Dann müsstest Du Dreieck für Dreieck testen, ob es von dem Strahl geschnitten wird. Glaube mir, das ist nicht gerade einfach.

    Vielleicht reicht die von mir vorgeschlagene Lösung ja aus. Ansonsten schau Dich mal nach einem Tutorial über "Picking" um (z.B. bei google).



  • //DirectX SDK 8

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

    //Ich habe gelesen das GetViewport nicht bei jeder Grafikkarte functioniert.
    // geprüft, GEHT
    fD3dDevice->GetViewport(&lViewport);
    fD3dDevice->GetTransform(D3DTS_WORLD,&lWorldMatrix);
    fD3dDevice->GetTransform(D3DTS_VIEW,&lViewMatrix);
    fD3dDevice->GetTransform(D3DTS_PROJECTION,&lProjectionMatrix);

    D3DXVec3Project(
    &lVector, // hier liegt vielleicht ein fehler vor
    &lVector, // ich benutze 2 mal den gleichen lVector 😕
    &lViewport,
    &lProjectionMatrix,
    &lViewMatrix,
    &lWorldMatrix);

    Habe ich jetzt in lVector.x und lVector.y den Mittelpunkt von meiner Karte ?
    Und wenn ja, woher weiss diese Function denn, dass ich meine Karte suche ?
    // Ich sehe keine Variable von meinem KartenMesh .... Sorry

    MFG, Dieter

    PS: Ich werde meine Karte nicht in die Tiefe ( also, von der Kamera weg ) oder zur Nähe bringen. Sie bleibt da wo sie iss ... Picking ??? Ich finde sie ja so schon nicht 🙂 ....

    MFG, Dieter


Anmelden zum Antworten