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. ==与equals()区别

    equals和==的区别? 经常被简单的理解为equals方法用来比较两个对象是否相同, 而==比较运算符用来比较两个基本数据类型的数值是否相同. 这样的理解无可厚非,但还要透过简单看看本质,才会更清 ...

  2. 2-SAT浅谈

    2-SAT浅谈 一.2-SAT问题 首先,什么是$2-SAT$问题.现在给出这样一类问题:给出$n$个点和关于这$n$个点的$m$条限制条件,并且这$n$个点中,每一个点只有两种状态.对于上述问题,我 ...

  3. spoj - Distinct Substrings(后缀数组)

    Distinct Substrings 题意 求一个字符串有多少个不同的子串. 分析 又一次体现了后缀数组的强大. 因为对于任意子串,一定是这个字符串的某个后缀的前缀. 我们直接去遍历排好序后的后缀字 ...

  4. Web Api 返回图片流给前端

    public class TestController : ApiController { public HttpResponseMessage GetImg() { //获取文件的绝对路径 stri ...

  5. 七. 多线程编程6.isAlive()和join()的使用

    如前所述,通常你希望主线程最后结束.在前面的例子中,这点是通过在main()中调用sleep()来实现的,经过足够长时间的延迟以确保所有子线程都先于主线程结束.然而,这不是一个令人满意的解决方法,它也 ...

  6. delphi 读取编译的version信息

    在create中调用就可以了 unit About; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, ...

  7. JAVA实现通用日志记录

    原文:http://blog.csdn.net/jinzhencs/article/details/51882751 前言: 之前想在filter层直接过滤httpServerletRequest请求 ...

  8. xcode 6 exporting ipa 提示 Your account already has a valid iOS distribution certificate 的另一种解决方法

    背景: 1. XCode 6.1 2. 证书:develop 证书 3. Scheme 为Device 操作: 在Product - Archive 包过程中,选择Save for Ad hoc De ...

  9. ckeditor的详细配置(转)

    CKEditor 3 JavaScript API Documentation : http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.con ...

  10. 智能选择器和语义化的CSS

    本文由白牙根据Heydon Pickering的<Semantic CSS With Intelligent Selectors>所译,整个译文带有我自己的理解与思想,如果译得不好或不对之 ...