您的位置:首页 > 运维架构

OpenGL 入门13

2017-01-08 20:49 148 查看

原帖地址:

http://ogldev.atspace.co.uk/www/tutorial14/tutorial14.html

这篇教程里,我们将学会操控我们的相机在空间中随意移动。我们用键盘来控制相机的位置并且用鼠标来控制相机的朝向。大多数的第一人称射击游戏都是采用这种操作方式,不过让我们暂时专注于实现键盘的控制。

根据游戏界的悠久传统,我们会实现四个方向的键盘控制:前后左右。影响摄像机的变量包括摄像机的位置,up方向以及lookat方向,这里我们只更改摄像机的位置,其他的两个变量保持不变。

是时候来一个全新的API了:

glutSpecialFunc()


这个api会注册一个函数。注册的这个函数在我们按下特定的按钮之后会被调用。这个API支持键盘上的所有按键,包括功能键,方向键以及PAGE-UP/PAGE-DOWN/HOME/END/INSERT。如果你只想使用字母和数字按键的话,记得用glutKeyboardFunc()。

步骤

首先我们在代码里面添加这个按键回调的函数:

static void SpecialKeyboardCB(int Key, int x, int y)
{
GameCamera.OnKeyboard(Key);
}


这个函数里面调用了GameCamera.onKeyboard(key),而这个函数是做啥的呢?

bool Camera::OnKeyboard(int Key)
{
bool Ret = false;

switch (Key) {

case GLUT_KEY_UP:
{
m_pos += (m_target * StepSize);
Ret = true;
}
break;

case GLUT_KEY_DOWN:
{
m_pos -= (m_target * StepSize);
Ret = true;
}
break;

case GLUT_KEY_LEFT:
{
Vector3f Left = m_target.Cross(m_up);
Left.Normalize();
Left *= StepSize;
m_pos += Left;
Ret = true;
}
break;

case GLUT_KEY_RIGHT:
{
Vector3f Right = m_up.Cross(m_target);
Right.Normalize();
Right *= StepSize;
m_pos += Right;
Ret = true;
}
break;
}

return Ret;
}


我们发现,这里就是处理我们按键消息的地方。没按一次按键,摄像机的位置就会增加stepSize。计算出新位置之后,记得要将新的位置传送给vertexShader。

我们注册这个按键回调函数的代码如下:

glutSpecialFunc(SpecialKeyboardCB);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: