OpenGL(二十) glutSpecialFunc响应键盘方向控制键


OpenGL的glut中使用glutMouseFunc函数注册鼠标响应事件,使用glutKeyboardFunc函数注册键盘响应事件,对键盘上特殊的4个方向按键的响应函数是glutSpecialFunc


方向键响应事件的实现函数的格式是void SpecialKey(GLint key,GLint x,GLint y);


其中key对应4个方向按键,上下左右按键分别对应于GLUT_KEY_UP、GLUT_KEY_DOWN、GLUT_KEY_LEFT和GLUT_KEY_RIGHT;


x和y是捕捉的当按键事件发生时显示窗口上鼠标点所处的位置,需要注意的是x和y是以左上角为起点(0,0),右下角为终点(windowWidth,windowHeight)。


以下程序注册方向按键事件,每次按下方向键,函数的视口函数glViewport的参数发生变化,从而模型投影到屏幕窗口上的位置会发生改变,可以模拟模型在上下左右4个方向上发生移动的情况:


#include"freeglut.h"

GLfloat xOffset=0.0f,yOffset=0.0f;

void myDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);	
	glColor3f(0,1,0);

	glViewport(xOffset,yOffset,400,400);
	glRectf(160,160,240,240);

	glutSwapBuffers();
}

void Init()
{	
	glClearColor(1,1,1,1);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0,400,0,400);
}

void SpecialKey(GLint key,GLint x,GLint y)
{
	if(key==GLUT_KEY_UP)
	{
		yOffset+=10;
	}	
	if(key==GLUT_KEY_LEFT)
	{
		xOffset-=10;
	}
	if(key==GLUT_KEY_DOWN)
	{
		yOffset-=10;
	}
	if(key==GLUT_KEY_RIGHT)
	{
		xOffset+=10;
	}
	myDisplay();
}

int main(int argc, char *argv[])      
{      
	glutInit(&argc, argv);   //初始化GLUT  
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);    
	glutInitWindowPosition(500, 200);      
	glutInitWindowSize(400, 400);      
	glutCreateWindow("OpenGL");   
	Init();   
	glutDisplayFunc(&myDisplay);   //回调函数   
	glutSpecialFunc(&SpecialKey);
	glutMainLoop();         
}   

按下上下左右方向键,可以控制显示区域中的绿色方框上下左右移动:



原文地址:https://www.cnblogs.com/mtcnn/p/9411907.html