Objektauswahl im Leveleditor, Problem



  • Surkevin schrieb:

    parallel 🙂
    Mh...was würdest du angeben? Soll ich vielleicht doch die erste genannte Methode anwenden?

    Ich würde den richtigen Strahl angeben. Welche Methode du benutzen willst, musst du schon selbst wissen.

    Bye, TGGC (Just think about it)



  • mh, also Feststellung (:) :
    Wenn ich mich direkt vom Start wegen GAR nicht wegbewege, sondern nur mit der Maus die Perspektive ändere, kommt der Strahl perfekt(est 🙂 da an, wo er soll, sobald ich mich aber wegbewege nicht mehr. Den Endpunkt berechne ich doch dann so:
    cameraposition + RayDir*500 oder ist da was falsch? Peinlich wärs 🙂
    Gruß,
    Kevin



  • Strahlen haben keinen Endpunkt.

    Bye, TGGC (Just think about it)



  • ja, da ich aber keine andere Möglichkeit fand, ihn visuell darzustellen, habe ich mir eine Klasse gebastelt, die einen Strahl mit Anfangs-und Endpunkt darstellen kann 🙂 Mich wundert, dass der Punkt nur, wenn sich die Kameraposition verändert, daneben geht 😕 Kannst du dir vorstellen wieso? Die Viewmatrix wird ja in die Berechnung einbezogen 😕 Bei Stefans Lösung stimmt die Richtung eigentlich, nur ist der Strahl dann immer ca. einen Meter 🙂 (schön, hier Maße anzugeben) über dem tatsächlich angeklickten Polygon 🙂

    Gruß,
    Kevin (Das Geburtstagskind 😉

    /EDIT
    Wollte jetzt mal die Methode von der Seite, die Stefan Zerbst gepostet hat ausprobieren, nur finde ich in der kompletten d3dx9math.h keine neue gleiche Funktion für D3DMath_VectorMatrixMultiply ... manman, wie heißt die denn hier? 🙂



  • Herzlichen Glückwunsch! 🤡 👍



  • *g* Danke, ein schönes Geschenk wäre ja, wenn das endlich mal klappen würde *fg*



  • Oh man das ist doch echt zum Ratten melken, hab jetzt drei Methoden,
    Methode 1:

    D3DXMATRIXA16 matProj; 
            MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_PROJECTION, &matProj ); 
    
            POINT ptCursor; 
            GetCursorPos( &ptCursor ); 
            ScreenToClient( MainObjects.dd_obj.hwnd, &ptCursor ); 
    
            // Compute the vector of the pick ray in screen space 
            D3DXVECTOR3 v, vPickRayDir, vPickRayOrig; 
            v.x =  ( ( ( 2.0f * ptCursor.x ) / 640  ) - 1 ) / matProj._11; 
            v.y = -( ( ( 2.0f * ptCursor.y ) / 480 ) - 1 ) / matProj._22; 
            v.z =  1.0f; 
    
            // Get the inverse of the composite view and world matrix 
            D3DXMATRIXA16 matView, matWorld, m; 
            MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_VIEW, &matView ); 
            MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_WORLD, &matWorld ); 
    
            m = matWorld * matView; 
            D3DXMatrixInverse( &m, NULL, &m ); 
    
            // 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; 
            vPickRayOrig.x = m._41; 
            vPickRayOrig.y = m._42; 
            vPickRayOrig.z = m._43;
    
    		MainObjects.m_jet.Init(&MainObjects.dd_obj, MainObjects.m_camera.m_vPosition, MainObjects.m_camera.m_vPosition + (vPickRayDir*500));
    

    Methode 2:

    D3DVIEWPORT9 viewport;
    	MainObjects.dd_obj.lpD3DDevice->GetViewport(&viewport);
    
    	POINT p;
    	GetCursorPos(&p);
    	ScreenToClient(MainObjects.dd_obj.hwnd, &p);
    
    	D3DXVECTOR3 point, vec;
    	point.x = (float)p.x;
    	point.y = (float)p.y;
    	point.z = 1.0f;
    
        D3DXMATRIX matWorld, matView, matProjection; 
    	MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_WORLD, &matWorld ); 
    	MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_VIEW, &matView ); 
    	MainObjects.dd_obj.lpD3DDevice->GetTransform( D3DTS_PROJECTION, &matProjection ); 
    
    	D3DXVec3Unproject(&vec, &point, &viewport, &matProjection,
    		&matView, &matWorld);
    
    D3DXVECTOR3 pEnd = MainObjects.m_camera.m_vPosition + (vec*500);
    
    	MainObjects.m_jet.Init(&MainObjects.dd_obj, D3DXVECTOR3MainObjects.m_camera.m_vPosition , pEnd);
    

    Methode 3:

    D3DVECTOR p1, p2;
    	POINT p;
    	GetCursorPos(&p);
    	ScreenToClient(MainObjects.dd_obj.hwnd, &p);
    	calcRay(p.x, p.y, p1, p2);
    
    	MainObjects.m_jet.Init(&MainObjects.dd_obj, p1, p2);
    

    Bei Methode 1 und Methode 3 erziele ich in etwa das gleiche Ergebnis: Der Strahl fährt ein Stück zu weit oben und meist auch ein Stück zu weit Rechts am tatsächlichen Objekt vorbei. Bei Methode 2 trifft der Strahl 100% exakt auf das Objekt, aber nur, wenn ich mich nicht vorwärts, rückwärts oder seitwärts bewege. Die Perspektive kann ich hierbei aber beliebig ändern. Hat jemand vielleicht eine Ahnung? Langsam wirds wirklich deprimierend 😞

    Danke,
    Gruß,
    Kevin



  • Um euch das mal alles zu demonstrieren, gibt es hier für jede Methode eine Exe:
    http://mitglied.lycos.de/Surkevin2/RayTransformation.zip
    Um durch die Welt zu fliegen, müsst ihr die Rechte Maustaste gedrückt halten. Um einen Strahl zu erzeugen, müsst ihr einfach klicken.
    Per Datei->Laden einfach ein DirectX File laden. Ich wäre euch wirklich dankbar, wenn ihr mir helfen könntet. Komm TGGC, du bist doch der Godfather of DirectX 🙂 (auch wenn es mir ein wenig peinlich ist, da ich nicht immer einverstanden mit deinen Posts bin, und das dir nicht unbedingt höflich gezeigt habe).

    Gruß,
    Kevin



  • Surkevin schrieb:

    Um euch das mal alles zu demonstrieren, gibt es hier für jede Methode eine Exe:
    http://mitglied.lycos.de/Surkevin2/RayTransformation.zip
    Um durch die Welt zu fliegen, müsst ihr die Rechte Maustaste gedrückt halten. Um einen Strahl zu erzeugen, müsst ihr einfach klicken.
    Per Datei->Laden einfach ein DirectX File laden. Ich wäre euch wirklich dankbar, wenn ihr mir helfen könntet. Komm TGGC, du bist doch der Godfather of DirectX 🙂 (auch wenn es mir ein wenig peinlich ist, da ich nicht immer einverstanden mit deinen Posts bin, und das dir nicht unbedingt höflich gezeigt habe).

    Gruß,
    Kevin

    Die Programme laufen bei mir nicht.
    Lade doch gleich den Quellcode mit hoch, vielleicht wird dann deutlicher wo dein Fehler liegt.

    Viele Grüße
    Fischi



  • Die laufen bei dir nicht? Geht die Fehlerbeschreibung bitte präziser? 😉
    Der Source:
    http://mitglied.lycos.de/Surkevin2/ModelModificator(DX9).zip

    Die Struktur ist noch nicht die Beste, ich weiß 🙂 In OnLMouseButtonDown geschehen die Berechnungen.

    Gruß,
    Kevin



  • Dein Fenster ist zwar 640x480 groß, nichtaber(?) der Clientbereich wo reingezeichnet wird. Daran könnte es liegen, oder daran, dass das dargestelle Prisma falsch ist.
    Nein, ich denke eher das erste.



  • Mh, ich initialisiere aber alles mit 640*480



  • Wenn ich Stefan Zerbts Methode mit GetClientRect Daten mache, funktioniert alles, JUHU! Aber wieso kapiert D3DXVec3Unproject das nicht, obwohl ich alles mit 640*480 initalisiere?
    DANKE,
    Gruß,
    Kevin



  • Surkevin schrieb:

    Wenn ich Stefan Zerbts Methode mit GetClientRect Daten mache, funktioniert alles, JUHU! Aber wieso kapiert D3DXVec3Unproject das nicht, obwohl ich alles mit 640*480 initalisiere?
    DANKE,
    Gruß,
    Kevin

    Du initialisierst die Größe des Fensters mit 640 x 480, dann musst
    du aber noch die Größe des Titelleiste und des Randes abziehen, dann hast
    du die Größe des Zeichenbereiches.

    Also solltest du das an folgender Stelle so machen:

    D3DSURFACE_DESC ddsd;
    memset(&ddsd,0,sizeof(ddsd));
    
    IDirect3DSurface9 *lpDDS;
    MainObjects.dd_obj.lpD3DDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&lpDDS);
    
    lpDDS->GetDesc(&ddsd);
    
    // Compute the vector of the pick ray in screen space 
    D3DXVECTOR3 v, vPickRayDir, vPickRayOrig; 
    v.x =  ( ( ( 2.0f * ptCursor.x ) / ddsd.Width  ) - 1 ) / matProj._11; 
    v.y = -( ( ( 2.0f * ptCursor.y ) / ddsd.Height )  - 1) / matProj._22; 
    v.z =  1.0f; 
    ...
    

    Wenn ich das Programm bei mir compiliere funktioniert es auch.
    (Die exe von dir hat bei mir eine Accessviolation verursacht)

    Viele Grüße
    Fischi



  • Hatte Stefan nicht von Anfang an gesagt, die Rechnung wäre nicht der Fehler... 😎

    Bye, TGGC \-/



  • Hallo,
    Ja die Berechnung funktioniert ja mit GetClientRect-Daten 🙂 Aber wieso funktioniert die D3DXVec3Unproject-Funktion nicht korrekt, wenn ich mich bewege? 🙂 Cool, dass die Anwendung bei euch Accessviolations verursacht *fg*
    Gruß,
    Kevin


Anmelden zum Antworten