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

Lighthouse3d.com >> GLUT Tutorial >> Input >> Move the Camera I 下面来看一个更有趣的GLUT应用.本节我们会绘制一个雪人世界,并直接用按键移动镜头.向左和向右键会在XZ切面围绕Y轴旋转镜头.反之,向上和向下键会在当前方向向前向后移动镜头. 实现代码已经在适当地方标上注释.首先我们要一些全局变量来保存镜头参数.这些变量会保存了镜头位置和目标方向的向量.我们还需要保存角度.由于y是常量,所以不用保存. angl…
Lighthouse3d.com >> GLUT Tutorial >> Input >> Moving the Camera III 上一节的示例中我们用键盘更改镜头的方向.这一节我们用鼠标来代替. 当用户按下鼠标左键时我们会记录鼠标的X轴位置.当鼠标移动时我们会检测新的X轴位置,并利用位移差距设置一个deltaAngle变量.该变量会加到初始角度以计算镜头当前的方向. 鼠标点击时的X轴位置也需要变量来保存. float deltaAngle = 0.0f; ; 注意…
Lighthouse3d.com >> GLUT Tutorial >> Input >> Move the Camera II 本节的最后一个示例是回顾.现在我们会使用键盘的高级特性. 方法是测试当键盘按下时开始运动.因此我们打算用glutIgnoreKeyRepeat关闭重复按键的回调函数. 当一个键被按下,我们设置一个非零的变量值.一旦按钮松开,该变量会置零. 当按键的按下和松开事件没有绑定函数时,我们需要检查渲染函数中以下两个变量来保持更新镜头位置和方向的一致性…
http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgard把它设计成跨平台的库.所以不用管x-window或者微软的windows系统.Kilgard先实现了x-window版本,然后Nate Robins移植到微软的windows系统下.感谢他们俩. 利用GLUT你可以5行代码实现一个OpenGL窗体,再用3-4行代码实现你的鼠标键盘事件. GLUT令…
Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直到所有源代码都使用显示函数作为空闲函数.这意味着当没有任何事件要处理的时候GLUT会调用显示函数,也就是说,它会尽可能频繁的调用显示函数. 这个一个建立交互程序的简单方法.当你的回调函数处理完键盘事件后,显示函数会自动被调用,屏幕会被重绘. 我们要做的只是把显示函数和空闲函数注册到同一个回调函数. 如果我们的…
Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启高性能全屏渲染而设计的.有些GLUT功能像弹出菜单和子窗体会因为增强性能而关闭.本节介绍GLUT的游戏模式.关于这个主题的教程和代码是可用的.由于我找不到官方文档,也没有其它教程关于这个主题,所以我不保证这节所有的内容都是对的.我建了一堆测试例子来尝试分析游戏模式的工作原理,但毕竟不同硬件的测试有限,所以会存…
Lighthouse3d.com >> GLUT Tutorial >> Fonts >> Bitmap Fonts and Orthogonal Projections 一般用法下,位图字体只能以二维的形式显示信息给用户.例如,一个简单的例子,我们想显示应用程序每秒的帧数.这些信息可以驻留在同一个位置,即使用户移动镜头.除此之外,用二维的正交投影比透视投影更容易计算这些位置,因为我们可以指定用像素表示该位置. 实现的基本模式是以之前的方式绘制世界,用透视投影,然后切换…
Lighthouse3d.com >> GLUT Tutorial >> Basics >> Setup 你需要什么 要用GLUT库开发程序,你可以下载最新版本3.7.6.你可以下GLUT的源代码,也可以直接下Windows二进制文件(.h/.lib/.dll) 要用GLUT库开发C/C++程序,要用到以下三个文件: glut.h - 这是你的程序要用到的包含头文件.一般放到C:\Program Files\Microsoft Visual Studio 11.0\VC…
Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> The Code So Far VIII 以下代码用glutPostRedisplay函数代替了原来的空闲函数的回调. #include <stdio.h> #include <stdlib.h> #include <math.h> #ifdef __APPLE__ #include <GLUT/glut…
Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far VII 以下是子窗体的最终版本代码. #include <stdio.h> #include <stdlib.h> #include <math.h> #ifdef __APPLE__ #include <GLUT/glut.h> #else #include <GL/glut.h> #…
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Rendering to Subwindows 先回顾一下之前的回调函数定义,当窗体和子窗体创建时定义的: 空闲函数 - renderSceneAll 主窗体的显示函数 - renderScene 子窗体1的显示函数 - renderScenesw1 子窗体2的显示函数 - renderScenesw2 子窗体3的显示函数 - renderScenesw3 我们会从各个…
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Reshape Subwindows 重整函数的回调需要处理两件事:修改子窗体的大小,重新计算投影每个子窗体的投影矩阵.在我们的情况中,我们不需要渲染任何几何图案到主窗体,所以我们可以跳过重新计算投影矩阵这一步. 先来介绍修改大小和重定位子窗体的函数原型. void glutPositionWindow(int x, int y);void glutReshapeWin…
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Creating and Destroying Subwindows 利用GLUT我们可以定义子窗体,例如切分主窗体到不同区域,每个子窗体有自己的OpenGL上下文和回调函数.一个可行的程序是可以同时提供几种相同场景的视觉. 为了创建子窗体,我们可以使用glutCreateSubWindow函数,原型如下: int glutCreateSubWindow(int par…
Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far VI 下面代码以窗体模式启动.你可以在一堆给定的设置中选择用哪个进入游戏模式,也可以返回窗体模式.命令是用位图字体显示在屏幕上. #include <stdio.h> #include <stdlib.h> #include <math.h> #ifdef __APPLE__ #include <GLUT…
Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far V 该代码与位图字体的代码类似.区别是用了笔划字体来显示每个雪人上的数字,然后雪人是用正交投影来显示,还有一段用位图字体显示的文本.后面包含了每秒帧数的文本不受镜头移动的影响,它一直停留在屏幕的相同位置. 字体菜单也改成了用笔划字体代替位图字体. #include <stdio.h> #include <stdlib.h>…
Lighthouse3d.com >> GLUT Tutorial >> Extras >> Frames per Second 你的程序实际上跑得多快? 有时我们我们改了一个小地方却不确定效果有没有表现出来,即它们如何影响每秒显示的帧数.本节我们会来看怎么使用GLUT来计算出每秒的帧数.注意这不能看作是真是测试数据,它只是个参考值. GLUT提供一个函数来查询系统中的很多特性,其中之一是获取调用glutInit函数时使用的毫秒数.该函数是glutGet,原型如下: i…
Lighthouse3d.com >> GLUT Tutorial >> Fonts >> Stroke Fonts 笔划字体是用线条生成的.跟位图字体相反,笔划字体看上去像三维对,例如,字体可以旋转,测量和转化. 本节我们将会使用GLUT函数来生成一些笔划字体到屏幕.基础函数是glutStrokeCharacter.原型如下: void glutStrokeCharacter(void *font, int character) font - 用到的字体的名字 cha…
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> The Code So Far IV 以下代码使用了位图字体.它在每个雪人的上方显示一个数字.该数字可以用鼠标右键的弹出菜单来设置. #include <stdlib.h> #include <stdio.h> #include <math.h> #ifdef __APPLE__ #include <GLUT/glut.h&…
Lighthouse3d.com >> GLUT Tutorial >> Fonts >> Bitmap Fonts 位图字体一般是二维字体.虽然我们会把它放到三维世界,但这些字体没有厚度,也不能渲染和测量,只能翻译.除此之外,字体会一直面向镜头,像一张广告牌一样.虽然这个可以看作是潜在的缺点,但另一方面看我们也不用考虑字体的方向问题. 本节我们会演示GLUT函数如何显示位图文本到屏幕.这里用到glutBitmapCharacter函数来写入字符.原型如下: void…
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> The Code So Far III 这里我们准备包含一些前面几节展示过的素材.我们准备添加菜单到应用程序,子菜单和菜单交换. 直接复制粘贴下面代码到你的项目.鼠标右键会打开菜单.按键's'和'c'会生效到菜单选项. #include <stdlib.h> #include <math.h> #ifdef __APPLE__ #includ…
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Swapping Menus GLUT甚至可以在应用程序过程中更改整个菜单.提供了两个函数: glutSetMenu和glutGetMenu.原型如下: void glutSetMenu(int menu); menu - 上一个创建菜单的索引值 该函数可以让我们切换菜单,例如在应用程序上下文中切换. int glutGetMenu(void); 该函数返回当前菜单…
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Modifying Menus 肯定会有菜单需要被修改的状况出现.GLUT运行我们修改和删除菜单项.修改菜单项的函数原型如下: void glutChangeToMenuEntry(int entry, char *name, int value); entry - 菜单项的索引值,介乎于1和菜单项总数之间 name - 新菜单项的名 value - 菜单项被选中时…
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Sub Menus 上一节我们介绍了如何创建普通菜单和如果绑定用户选定的菜单到处理事件.下面来介绍分层子菜单. 子菜单的创建和菜单用的是同一个函数.创建后插入到菜单的函数glutAddSubMenu原型如下: void glutAddSubMenu(char *entryName, int menuIndex); entryName - 子菜单名 menuIndex…
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Popup Menus 弹出菜单也是GLUT的一部分.虽然没有实现所有的窗体系统的弹出菜单的功能,但是GLUT也完成了一些非常有用的部分.为应用程序添加菜单,并提供一个简单的途径来交互和用键盘选择选项,避免了记住所有快捷键的麻烦. 第一步我们必须先创建一个菜单.GLUT的glutCreateMenu函数原型如下: int glutCreateMenu(void (*…
Lighthouse3d.com >> GLUT Tutorial >> Input >> The Code So Far II 以下是前面几节的完整整合代码: #include <stdlib.h> #include <math.h> #ifdef __APPLE__ #include <GLUT/glut.h> #else #include <GL/glut.h> #endif // angle of rotation…
Lighthouse3d.com >> GLUT Tutorial >> Input >> The Mouse 上一节我们讨论了怎么用GLUT的键盘函数跟OpenGL应用程序进行交互.现在来探讨鼠标的.GLUT的鼠标接口提供了一堆可选的事件来添加鼠标交互,来监测鼠标点击和鼠标移动. 监测鼠标点击事件 和键盘事件一样,GLUT提供了响应鼠标点击事件的注册回调函数.函数名是glutMouseFunc,也是在程序的初始化语句中被调用.原型如下: void glutMouseF…
Lighthouse3d.com >> GLUT Tutorial >> Input >> The Code So Far 以下是前面几节的完整整合代码: #include <stdlib.h> #include <math.h> #ifdef __APPLE__ #include <GLUT/glut.h> #else #include <GL/glut.h> #endif // angle of rotation fo…
Lighthouse3d.com >> GLUT Tutorial >> Input >> Advanced Keyboard 本节我们会介绍另外4个处理键盘事件的函数.这些函数手把手的把我们从处理自动重复输入按键的问题中释放. 第一个函数允许我们关闭键盘自动重复输入.原型如下: int glutSetKeyRepeat(int repeatMode); repeatMode - 开启,关闭和恢复自动重复输入模式.可选值如下: GLUT_KEY_REPEAT_OFF –…
Lighthouse3d.com >> GLUT Tutorial >> Input >> Keyboard GLUT可以让应用程序自动监测键盘输入,包括普通按键和特殊按键,例如F1和向上键.本节我们来讨论怎样监测按键事件和如何响应. 目前为止你应该已经发现,需要GLUT处理对应的事件,必须先告知GLUT把事件绑定到指定函数.之前已经介绍了重绘事件,系统空闲事件和窗体更改大小事件. 同样的,下面来介绍键盘事件.我们要告知GLUT哪个函数是响应按键处理的. GLUT提供两…
Lighthouse3d.com >> GLUT Tutorial >> Basics >> Animation 前面章节我们已经创建了一个白色三角形的窗体.还没到高潮,现在开始感受OpenGL动画的乐趣.我们会让三角形旋转. 首先我们要告知GLUT应用程序当处于空闲时,渲染函数要被调用.这样可促使GLUT保持调用渲染函数来启用动画效果.GLUT提供一个函数glutIdleFunc来让你注册一个回调函数用于绑定应用程序空闲时事件. void glutIdleFunc(v…