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

14.02.2009, 12:00

tbLineHitsModel geht nicht

Hallo

Ich habe mich in den letzten Wochen intensiv mit dem Buch
"3D Spieleprogrammierung mit C++ und DirectX9" auseinandergesetzt
ich hatte viele Rückschläge, doch durch dieses Forum, viel Geduld konnte ich mich ein bisschen einarbeiten. Meine Ziele sind hoch gesteckt.. ich will ein 3D Schach machen. Ich dachte erst die 3D umgebung sei das einfachste. Doch da habe ich mich getäuscht! Zu meinem Problem:
Das Feld kann ich zeichnen, die Bauern raufstellen, alle Positionen in Arrays gepackt... die Maus wurde mit DirectInput initalisiert und die CursorPosition wird beim debuggen angezeigt. doch ich kann keinen Bauern anklicken.
Ich habe mir für das anklicken das Pick example von DirectX angeschaut und einige Threads hier gelesen. Klingt alles plausiebel aber irgendwo mache ich einen Fehler:

hier meine Pick funktion:



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        //Cursor Position

        POINT ptCursor;
        
        //Cursor holen

               GetCursorPos(&ptCursor);
        ScreenToClient(D3D.GetWindow(),&ptCursor);
        
        
        // Compute the vector of the pick ray in screen space

        D3DXVECTOR3 v;      
        v.x =  ((2.0f * ptCursor.x /640)-1)/mProjection.m11;
        v.y = -((2.0f * ptCursor.y /480)-1)/mProjection.m22;
        v.z =  1.0f;
        
        // Get the inverse view matrix  

        tbMatrix x_matrix = mWorld * mCamera;
        tbMatrix m;
        m = tbMatrixInvert(x_matrix);

        // Transform the screen space pick ray into 3D space

            vPickRayDir.x  = v.x*m.m11 + v.y*m.m21 +v.z*m.m31;
            vPickRayDir.y  = v.x*m.m12 + v.y*m.m22 +v.z*m.m32;
            vPickRayDir.z  = v.x*m.m13 + v.y*m.m23 +v.z*m.m33;
            vPickRayOrig.x = m.m41;
            vPickRayOrig.y = m.m42;
            vPickRayOrig.z = m.m43;



Es könnte am Backbuffer liegen die Breite und die Höhe nehme ich fix 640 * 480 allerdings führe ich auch in der Auflösung aus!

oder es könnte an mWorld liegen oder mCamera, die beiden sind Global.
mWolrd kann ja vieles sein.. Bauer Position, Felder Position..??

mein aufruf in der Move Funktion von tbLineHitsModel

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
    if(MouseState.rgbButtons[0] & 0x80)
    {
        //MessageBox(NULL, "Hallo Gido", ":)",MB_OK | MB_ICONEXCLAMATION);

        
        Pick();
        tbMatrix transnorm =tbMatrixTranslation(bauer_pos[0]);
        tbMatrix transinvert =  tbMatrixInvert(transnorm);
        if(tbLineHitsModel(vPickRayOrig,PickRayDir,g_pBauerModelw1, transnorm,transinvert)){
            MessageBox(NULL, "Bauer getroffen", "Getroffen",MB_OK | MB_ICONEXCLAMATION);
        }

    }


Hier sieht man ich will nur den Bauern 1 anklicken.. die Textbox 2 ist noch nie gekommen! ich hab schon versucht anstatt PickRayDir
vPickRayOrig * PickRayDir zu machen, irgendwo war auch ein Beispiel mit * 2000.

Ich hoffe ich habe mich klar ausgedrückt
und ich würde mich um Hilfe freuen!

gruss fireflame

2

16.02.2009, 10:37

ich habs...

Ich habe es nun geschafft!

meine Fehler waren


C-/C++-Quelltext

1
2
3
4
      // Get the inverse view matrix   

        tbMatrix x_matrix = mWorld * mCamera;
        tbMatrix m;
        m = tbMatrixInvert(x_matrix);


hier darf ich nur die mCamera nehmen

und bei


C-/C++-Quelltext

1
2
if(tbLineHitsModel(vPickRayOrig,PickRayDir,g_pBauerModelw1, transnorm,transinvert)){
            MessageBox(NULL, "Bauer getroffen", "Getroffen",MB_OK | MB_ICONEXCLAMATION);


sollte ich wirklich PickRayDir*2000 nehmen!
wieso weiss ich nicht ! :)

Ich habe alles in Arrays getan sieht ein bisschen anders aus jetzt, daher könnte noch ein anderer Fehler dabei gewesen sein...

C-/C++-Quelltext

1
2
3
4
5
    for (int bauerhit=0;bauerhit<16;bauerhit++){
            if(tbLineHitsModel(vPickRayOrig,vPickRayDir*2000,g_pBauerModel[bauerhit], tbMatrixTranslation(bauer_pos[bauerhit]), tbMatrixInvert(tbMatrixTranslation(bauer_pos[bauerhit])))){
                MessageBox(NULL, "getroffeeeeeeeeeen", "muahahaha",MB_OK | MB_ICONEXCLAMATION);
            }
        }



gruss fireflame