[c++/DX] Kamerasteuerung

kickerxy123

Erfahrenes Mitglied
Hallo!

Ich verwende: DirectX9.0C Win XP SP3 Devarian cpp mit MinGW.

Mein Problem besteht in der richtigen Kamerasteuerung. Zwar habe ich eine implementiert, doch irgendwie denke ich, dass sie nicht richtig ausgerichtet ist.
Denn wenn ich mich entlang der z- Achse bewege, geht er durch den Boden durch (20° Winkel oder so). Es könnte allerdings auch an den Objekten liegen, dass diese schief im Raum liegen...

Das ist meine Kamerasteuerung (relevanter Auszug):
Code:
  //"Rollen" der Kamera auf z-Achse
  if(GetAsyncKeyState(VK_INSERT )) 
  {
  angle -= deg_to_rad(45.0f) * secsPassed;
  cameradir = setVektor(sinf(angle), lookUp, cosf(angle)); 
  }
  //"Rollen" der Kamera auf z-Achse
  if(GetAsyncKeyState(VK_HOME)) 
  {
  angle += deg_to_rad(45.0f) * secsPassed;
  cameradir = setVektor(sinf(angle), lookUp, cosf(angle)); 
  }
  if(GetAsyncKeyState(VK_SPACE)) secsPassed = 0;
   
trash = 10.0f*secsPassed;
//Kamera auf x-Achse rollen (hoch/runter gucken)
  if(GetAsyncKeyState(VK_LSHIFT)) cameradir = setVektor(sinf(angle), lookUp += 0.1f, cosf(angle));
  if(GetAsyncKeyState(VK_LMENU))  cameradir = setVektor(sinf(angle), lookUp -= 0.1f, cosf(angle));    

  //Kamera zoom
  if(GetAsyncKeyState(VK_PRIOR)) fov-= deg_to_rad(15.0f) * secsPassed * 10;
  if(GetAsyncKeyState(VK_NEXT))  fov+= deg_to_rad(15.0f) * secsPassed * 10;
 
//Kamera auf x-Achse bewegen 
  if(GetAsyncKeyState(VK_LEFT))  camerapos.x -= trash;
  if(GetAsyncKeyState(VK_RIGHT)) camerapos.x += trash;
 
//Kamera auf y-Achse bewegen
  if(GetAsyncKeyState(VK_RSHIFT)) camerapos.y += trash;
  if(GetAsyncKeyState(VK_RMENU))  camerapos.y -= trash;
  
//Kamera auf z-Achse bewegen
  if(GetAsyncKeyState(VK_UP ))   camerapos.z += trash; 
  if(GetAsyncKeyState(VK_DOWN )) camerapos.z -= trash;
  
  
//Mapgrenzen kontrollieren
  if(camerapos.x >= map.right  ) camerapos.x = map.right;
  if(camerapos.x <= map.left   ) camerapos.x = map.left;
  if(camerapos.y >= map.top    ) camerapos.y = map.top;
  if(camerapos.y <= map.bottom ) camerapos.y = map.bottom;
  if(camerapos.z >= map.depth  ) camerapos.z = map.depth;
  if(camerapos.z <= map.back   ) camerapos.z = map.back;

    
  if     (fov >= deg_to_rad(180.0f)) fov = deg_to_rad(179.9f);
  else if(fov <= deg_to_rad(0.0f))   fov = deg_to_rad(0.1f);


Matrix mCamera = matrixCamera(camerapos,vector3d_add(camerapos, cameradir),setVektor(0.0f, 1.0f, 0.0f));
 pD3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)(&mCamera));   

Matrix mProjection = matrixProjection(fov, aspect, 0.1f, 250.0f);
pD3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)(&mProjection));

Da auf den Befehl "Pfeil oben" lediglich die z- Position bearbeitet wird, sollte der Fehler nicht in der Abfrage, sondern eher in der Kameradefinition zu finden sein.

Oder aber, dass ich die Objekte schief in den Raum implementiere:
Code:
//Bewegliches Dreieck
triangleVertex[0].position = setVektor(0.0f,1.0f,0.0f);
triangleVertex[1].position = setVektor(1.0f,-1.0f,0.0f);
triangleVertex[2].position = setVektor(-1.0f,-1.0f,0.0f);
Code:
//Boden
ground[0].position = setVektor(0.0f,0.0f,-2.0f);
ground[1].position = setVektor(10.0f,0.0f,8.0f);
ground[2].position = setVektor(-10.0f,0.0f,8.0f);
Da ist auch schon mein 2. mysterisches Problem...
Denn der Boden ist nicht orthogonal zum Dreieck ausgerichtet! Vielmehr in einem etwa 60/70° Winkel.

Ansonsten kann ich auch noch mehr von meinem Quelltext veröffentlichen, bzw. die .exe einmal hochladen


Vielen Dank,
kickerxy
 
Zuletzt bearbeitet:
Hallo,

also erstmal solltest du auch den Up-Vektor Transformieren. Das hatte ich am Anfang auch nie gemacht was schonmal unschöne Drehungen bringt.

Leider weiß ich nicht wie deine CameraMatrix Funktion arbeitet und ich selbst benutzte immer die von DirectX.
Aber du solltest darauf achten das du den LookAt-Vector um den Positions-Vektor drehst und nicht umgekehrt. Sonst bewegt sich die Kamera bei jeder Drehung was dein Problem erklären würde.

Naja ich hoffe ich konnte dir helfen.

Gruß
Anfänger.
 
Hallo!

Nun, meine Kamerasteuerung klappt eigentlich schon ganz gut.
Es hapert an einer Stelle...
Und zwar soll die Kamera auf Befehl "pfeiltaste_hoch" in Blickrichtung vorwärts gehen
(also nicht entlang der z-Achse; also auch in x/y Richtungen). Dies klappt ohne Probleme. Selbiges umzusetzen für Links/Rechts ("Strafen-View") gelingt mir nicht so recht. In der Grundstellung(Blick entlang der z-Achse) bewegt sich die Kamera richtig entlang der x-Achse nach links oder rechts. Ändere ich die Blickrichtung, so sollte die Kamera sich nun auf Befehl "Links/Rechts" nicht mehr entlang der x-Achse, sondern orthogonal zur Blickrichtung bewegen! Dies habe ich versucht zu implementieren mit PI/2 (90°). Doch irgendwie scheint das ganze nicht zu funktionieren. Hier der relevante Abschnitt:
C++:
 if(GetAsyncKeyState(VK_LEFT)) 
  {
       playerposition.x -= geschwindigkeit*sinf((D3DX_PI/2)-rotAngleY);
       playerposition.z -= geschwindigkeit*cosf((D3DX_PI/2)-rotAngleY);       
  } 
 else if(GetAsyncKeyState(VK_RIGHT)) 
 {
       playerposition.x += geschwindigkeit*sinf((D3DX_PI/2)+rotAngleY);
       playerposition.z += geschwindigkeit*cosf((D3DX_PI/2)+rotAngleY);      
}


 if(GetAsyncKeyState(VK_UP))   //funktioniert!
 {
       playerposition.x += geschwindigkeit*sinf(rotAngleY);
       playerposition.z += geschwindigkeit*cosf(rotAngleY);         
       playerposition.y += geschwindigkeit*sinf(rotAngleX);    
 } 
else if(GetAsyncKeyState(VK_DOWN)) //funktioniert!
{
       playerposition.x -= geschwindigkeit*sinf(rotAngleY);
       playerposition.z -= geschwindigkeit*cosf(rotAngleY);     
       playerposition.y -= geschwindigkeit*sinf(rotAngleX);        
} 


kamera_lookAt.x = sinf(rotAngleY)+playerposition.x;
kamera_lookAt.z = cosf(rotAngleY)+playerposition.z;
kamera_lookAt.y = sinf(rotAngleX)+playerposition.y;
D3DXMatrixLookAtLH(&matrixView,&playerposition,&kamera_lookAt,&kamera_yAxis);
pD3DDevice->SetTransform(D3DTS_VIEW,&matrixView);
Vielen Dank schon einmal!
kickerxy123
 
Zurück