2009-04-24 97 views
1

我已經使用OpenGL/SDL創建了這個基本的3D演示。我處理了鍵盤迴調,因此我可以使用'a'和's'向左和向右「移動」,並使用's'和'w'向前和向後移動。如何使用OpenGL/SDL將鼠標控制爲像FPS一樣的攝像頭?

但是,我現在想做到這一點,所以我可以控制我的相機根據我的鼠標移動「尋找」的方向。就像在FPS射擊遊戲中,當您移動鼠標時,它會讓相機在各個方向上四處看。

有沒有人有任何想法如何我可以利用鼠標的回調來正確地「指向」相機類,當我移動鼠標?

#include "SDL.h" 
#include "Camera.h" 

Camera cam; 
Scene scn; 

//<<<<<<<<<<<<<<<<<myKeyboard>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
void myKeyboard(unsigned char key, int x, int y) 
{ 
    switch(key) 
    { 
    case 's': cam.slide(0.0, 0.0, 0.2); break; 
    case 'w': cam.slide(0.0, 0.0, -0.2); break; 
    case 'a': cam.yaw(-1.0); break; 
    case 'd': cam.yaw(1.0); break; 


    case 27: exit(0); 
    } 
    glClear(GL_COLOR_BUFFER_BIT); 
    glutPostRedisplay(); 
} 

void displaySDL(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    scn.drawSceneOpenGL(); 
    glFlush(); 
    glutSwapBuffers(); 
} 

int main(int argc, char* argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(640, 480); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("SDL Sence With Camera"); 
    glutKeyboardFunc(myKeyboard); 
    glutDisplayFunc(displaySDL); 
    glShadeModel(GL_SMOOTH); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_NORMALIZE); 
    glViewport(0, 0, 640, 480); 
    scn.read("fig5_63.dat"); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    scn.makeLightsOpenGL(); 

    cam.set(2.3, 1.3, 2.0, 0, 0.25, 0, 0, 1, 0); 
    cam.setShape(30.0f, 64.0f/48.0f, 0.5f, 50.0f); 

    glutMainLoop(); 
    return 0; 
} 

這是一個tar與我的SDL文件,以及我上面粘貼的文件和我的Camera類。 http://www.filedropper.com/fpsdemotar

如果有人可以給我一些技巧,我應該用什麼算法來處理鼠標回調方面的照相機,我將不勝感激。

謝謝!

回答

4

鼠標向上/向下移動 - >俯仰,鼠標向右/向左移動 - >偏航。

我不認爲讓你的'a'和'd'鍵偏航是準確的。

其實,你的整個設置對我來說有點奇怪,因爲從幾何角度來看,我將座標視爲(x,y,z)。你設置s和w去「上」和「下」(z),而不是「前進」和「後退」(y)。我把它看作是一張已經放在桌子上的xy圖形,並且你從上面看着它。靠近它減小z,這是從飛機出來的。

這是我如何將有它的設置:

w -> slide(0, 0.2, 0); // y 
s -> slide(0, -0.2, 0); 
a -> slide(-0.2, 0, 0); // x 
d -> slide(0.2, 0, 0); 

//The following goes in your mouse event handler or something: 
pitch(newMouseLocation.y - oldMouseLocation.y); // mouse y is related to pitch 
yaw(newMouseLocaiton.x - oldMouseLocation.x); // mouse x is related to yaw 

我知道你並不需要遵循這個座標約定,但它只是似乎更直觀我。

我希望這會有所幫助。

+0

感謝您輸入CookieOfFortune。我偶然發現一些指南,建議將鼠標置於屏幕中央。你認爲我應該這樣做嗎? – KingNestor 2009-04-24 02:15:40