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