所以,我試圖創建一個FPS風格的相機來探索我的場景,它似乎工作正常。目前無法改變相機的音調。我試圖創建一個函數,允許我將相機設置爲某些預定義的視點,但是當使用setPosition()函數將相機設置爲新視點後試圖旋轉相機時,我會遇到不在位置上的跳躍,而是在方向上當第一次按下旋轉按鈕時。使用gluLookAt的OpenGL FPS相機()
這是我的相機類的實現。
Camera::Camera(void)
{
angleX = 0.0;
angleY = 0.0;
directionX = 0.0;
directionZ = -5.0;
directionY = 0.0;
xPos = 0.0;
zPos = 1.0;
yPos = 2.0;
}
void Camera::setPosition(float xDir, float yDir, float zDir, float posX, float posZ, float posY)
{
directionX = xDir;
directionZ = zDir;
directionY = yDir;
xPos = posX;
zPos = posZ;
yPos = posY;
}
Camera::~Camera(void)
{
}
以下是我的特殊按鍵回撥功能,省略了攝像機移動以外的功能。
void specialKeys(int key, int xx, int yy)
{
float fraction = 0.3f;
switch(key)
{
// Camera Controls
case GLUT_KEY_LEFT:
camera.angleY -= 0.05f;
camera.directionX = sin(camera.angleY);
camera.directionZ = -cos(camera.angleY);
break;
case GLUT_KEY_RIGHT:
camera.angleY += 0.05f;
camera.directionX = sin(camera.angleY);
camera.directionZ = -cos(camera.angleY);
break;
case GLUT_KEY_UP:
camera.xPos += camera.directionX * fraction;
camera.zPos += camera.directionZ * fraction;
camera.yPos += camera.directionY * fraction;
break;
case GLUT_KEY_DOWN:
camera.xPos -= camera.directionX * fraction;
camera.zPos -= camera.directionZ * fraction;
camera.yPos -= camera.directionY * fraction;
break;
}
}
顯示回調函數,然後使用具有的gluLookAt下面的代碼:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(camera.xPos, camera.yPos, camera.zPos, camera.xPos+camera.directionX, camera.yPos+camera.directionY, camera.zPos+camera.directionZ, 0, 1, 0);
我不明白爲什麼我得到這個問題。我相信這是與設置相機和用於旋轉它的數學之間的相互作用有關。任何人都可以看到如何防止這種方向跳躍?
我設置在鍵盤的回調函數的攝像頭位置,代碼如下:
if(key == '1') // Default View
camera = Camera();
if(key == '2') // Ferris Wheel View
camera.setPosition(-0.8, 0.0, -0.6, 3.6, 3.6, 6.5);
if(key == '3') // Fountain Water View
camera.setPosition(0.9, 0.0, -0.4, -0.59, -6.4, 0.6);
道歉,因爲我可能是在我最初的問題was't清楚,但相機初始化後直是好的。按下後,例如'1'鍵,我調用setPosition()將攝像機設置到特定的位置。在設置此位置之後,攝像機將首先旋轉。我會修改我原來的問題。 – fanatic
我明白了。問題在於你設置的值和你計算的值之間的跳轉。你在用setPosition()調用什麼? –
在鍵盤迴調中,我會將代碼添加到原始問題中。 – fanatic