OpenGL 入门13

来源:互联网 发布:数控机床与编程教程 编辑:程序博客网 时间:2024/06/01 09:56

原帖地址:

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);
0 0