Lighthouse3d.com >> GLUT Tutorial >> Input >> Move the Camera II

本节的最后一个示例是回顾.现在我们会使用键盘的高级特性.

方法是测试当键盘按下时开始运动.因此我们打算用glutIgnoreKeyRepeat关闭重复按键的回调函数.

当一个键被按下,我们设置一个非零的变量值.一旦按钮松开,该变量会置零.

当按键的按下和松开事件没有绑定函数时,我们需要检查渲染函数中以下两个变量来保持更新镜头位置和方向的一致性.

在入门一节,我们有两个变量: deltaAngle和deltaMove.这两个变量各自控制了镜头的旋转和移动.当发生非零时,镜头会执行动作,为零时镜头保持不变.这两个变量的初始值为0,即初始为镜头不变.

在代码的开头我们准备添加两个变量来跟踪按键状态,一个是方向(deltaAngle),另一个是位置(deltaMove).

// the key states. These variables will be zero
// when no key is being presses
float deltaAngle = 0.0f;
float deltaMove = ;

在渲染函数我们会在开头添加一些代码来检查这两个变量和更新相应的位置和方向.

void renderScene(void) {

    if (deltaMove)
computePos(deltaMove);
if (deltaAngle)
computeDir(deltaAngle);
...

其中computePos和computeDir函数的定义如下:

void computePos(float deltaMove) {

    x += deltaMove * lx * 0.1f;
z += deltaMove * lz * 0.1f;
} void computeDir(float deltaAngle) { angle += deltaAngle;
lx = sin(angle);
lz = -cos(angle);
}

响应按键按下和松开的事件函数必须要有自动恢复机制.当键按下我们只是设置指定变量为非零值.当键松开的时候变量自动归零.

void pressKey(int key, int xx, int yy) {

    switch (key) {
case GLUT_KEY_LEFT : deltaAngle = -0.01f; break;
case GLUT_KEY_RIGHT : deltaAngle = 0.01f; break;
case GLUT_KEY_UP : deltaMove = 0.5f; break;
case GLUT_KEY_DOWN : deltaMove = -0.5f; break;
}
} void releaseKey(int key, int x, int y) { switch (key) {
case GLUT_KEY_LEFT :
case GLUT_KEY_RIGHT : deltaAngle = 0.0f;break;
case GLUT_KEY_UP :
case GLUT_KEY_DOWN : deltaMove = ;break;
}
}

最后,要在main函数中添加以下代码:

glutIngnoreKeyRepeat函数是被传入非零参数来让GLUT停止报告按键重复输入.往后看,glutSpecialkUpFunc函数是用于注册按键松开事件.

int main(int argc, char **argv) {

    // init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(,);
glutInitWindowSize(,);
glutCreateWindow("Lighthouse3D - GLUT Tutorial"); // register callbacks
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);
glutIdleFunc(renderScene);
glutSpecialFunc(pressKey); // here are the new entries
glutIgnoreKeyRepeat();
glutSpecialUpFunc(releaseKey); // OpenGL init
glEnable(GL_DEPTH_TEST); // enter GLUT event processing cycle
glutMainLoop(); return ;
}

[译]GLUT教程 - 移动镜头2的更多相关文章

  1. [译]GLUT教程 - 移动镜头1

    Lighthouse3d.com >> GLUT Tutorial >> Input >> Move the Camera I 下面来看一个更有趣的GLUT应用.本 ...

  2. [译]GLUT教程 - 移动镜头3

    Lighthouse3d.com >> GLUT Tutorial >> Input >> Moving the Camera III 上一节的示例中我们用键盘更改 ...

  3. [译]GLUT教程(目录)

    http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...

  4. [译]GLUT教程 - glutPostRedisplay函数

    Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直 ...

  5. [译]GLUT教程 - 游戏模式

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...

  6. [译]GLUT教程 - 位图和正交投影视图

    Lighthouse3d.com >> GLUT Tutorial >> Fonts >> Bitmap Fonts and Orthogonal Projecti ...

  7. [译]GLUT教程 - 安装

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Setup 你需要什么 要用GLUT库开发程序,你可以下载最新版本3. ...

  8. [译]GLUT教程 - 整合代码8

    Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> The Code So Far VII ...

  9. [译]GLUT教程 - 整合代码7

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far VII 以下是子窗体的最终版本代码. ...

随机推荐

  1. The expression being assigned to optional parameter `v2' must be a constant or default value

    今天写代码的时候遇到一个问题以前没有遇到过的问题,就是当我给一个对象参数赋值默认值的时候,报错了,代码如下 public void ShowOrHiddenKuang(bool isShow,Vect ...

  2. Linux Whois命令安装与使用

    大家都知道查看域名的详细信息,都是跑去whois服务器去查询,如 http://whois.chinaz.com 其实在Linux下直接有一个whois的命令,不过需要安装jwhois才可以,以Cen ...

  3. [给自己扫盲]Node.js 究竟是什么?

    Node.js 究竟是什么? 一个 “编码就绪” 服务器 Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能 ...

  4. PHP 让__get方法重新执行

    <?php class A { public function __get($p) { echo "getting $p\r\n"; if(isset($this->$ ...

  5. 【Mybatis】mybatis查询报错org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'areaName' in 'class java.lang.String'

    mybatis查询报错: Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for pro ...

  6. Date类型数据的加一天

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { if (startDate != null &am ...

  7. win7 32位安装 mong0db

    http://blog.csdn.net/u013457382/article/details/50775268

  8. EarlyZ disable( earlyz失效

    There are a few ways to disable EarlyZ list here: Shader depth output disabled Alpha test with depth ...

  9. Kubernetes - 配置Nginx-Ingress 作为服务发现

    添加 Kubernetes ConfigMap配置来自定义端口与服务的映射关系 配置文件, 有二个在默认空间下web服务和api服务分别映射到自定义端口 9001, 9002 apiVersion: ...

  10. Elasticsearch教程(一),全程直播(小白级别)

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...