OpenGL案例2----keyBoard键盘交互和鼠标交互

2023-11-06

#include <GL/glut.h>

//keyBoard键盘交互
void init()
{
	glClearColor(1.0, 1.0, 1.0, 0.0); //黑色背景颜色
	glMatrixMode(GL_PROJECTION);  //正投影
	glLoadIdentity();
	gluOrtho2D(-20, 30,-20,30);// 可以显示的范围
}
int xd = 0, yd = 0;
void myDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.8, 0.5, 0.6);
	glPointSize(5);
	glBegin(GL_POLYGON);
	glVertex2i(10 + xd, 10 + yd);
	glVertex2i(20 + xd, 10 + yd);
	glVertex2i(20 + xd, 0 + yd);
	glVertex2i(10 + xd, 0 + yd);
	glEnd();
	glFlush();//缓存推送到屏幕
}
void myKeyBoard(unsigned char key, int x, int y)
{
	switch (key)
	{
	case 'w': yd++; break;
	case 's': yd--; break;
	case 'd': xd++; break;
	case 'a': xd--; break;
	}
	glutPostRedisplay(); //重新执行myDisplay方法
}
int main(int argc, char* argv[])
{
	glutInit(&argc, argv);//初始化opengl
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//
	glutInitWindowPosition(300, 100); //窗口位置
	glutInitWindowSize(600, 500); //窗口大小
	glutCreateWindow("polyonTriangle"); //窗口名称

	init();
	glutDisplayFunc(myDisplay); //绘制函数
	glutKeyboardFunc(myKeyBoard);
	glutMainLoop();
	return 0;
}

结果:
在这里插入图片描述
键盘按w:向上;按s:向下 ; 按d:向右 按a:向左

代码2:

#include <GL/glut.h>
GLint w = 600 , h=500;
GLint dx = 0, dy = 0;
//鼠标交互
void init()
{
	glClearColor(1.0, 1.0, 1.0, 0.0); //黑色背景颜色
	glMatrixMode(GL_PROJECTION);  //正投影
	glLoadIdentity();
	gluOrtho2D(0,w,0,h);// 可以显示的范围
}

void myDisplay()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.87, 0.56, 0.4);
	glPointSize(2);
	glBegin(GL_POLYGON);
	glVertex2i(10 + dx, 10 + dy);
	glVertex2i(10 + dx, 100 + dy);
	glVertex2i(100 + dx, 100 + dy);
	glVertex2i(100 + dx, 10 + dy);
	glEnd();
	glFlush();//缓存推送到屏幕
}

//鼠标点击
void mouseMotion(GLint button,GLint state, GLint x, GLint y)
{
	if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) //鼠标左键按下
	{
		dx = x;
		dy = h - y;
		glutPostRedisplay(); //重新绘制
	}
}
int main(int argc, char* argv[])
{
	glutInit(&argc, argv);//初始化opengl
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//
	glutInitWindowPosition(200, 100); //窗口位置
	glutInitWindowSize(w, h); //窗口大小
	glutCreateWindow("Mouse Motion"); //窗口名称

	init();
	glutDisplayFunc(myDisplay); //绘制函数
	glutMouseFunc(mouseMotion);
	
	glutMainLoop();
	return 0;
}

结果:
在这里插入图片描述
矩形随鼠标左键点击而移动

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL案例2----keyBoard键盘交互和鼠标交互 的相关文章

  • 哪些 iomanip 操纵器具有“粘性”?

    我最近在创建一个stringstream由于我错误地假设std setw 会影响每次插入的字符串流 直到我明确更改它 然而 插入后它总是被取消设置 With timestruct with value of Oct 7 9 04 AM st
  • 在静态断言和运行时错误之间自动选择

    我有一个执行除法并检查对齐的宏 define BYTES TO WORDS x CHECK ALIGNMENT x 2 x 2 我想实施CHECK ALIGNMENT作为一个总是返回 1 的宏 并且如果满足以下条件则触发错误x不除以 2 宏
  • 如何使用 saxon 将文档类型参数传递给 xslt?

    对于发送原子数据类型将使用类似 transformer SetParameter new QName customXml new XdmAtomicValue true 如何将 XML Node 作为参数从 C 传递给 XSLT 你能帮我么
  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • C# 动态 Linq 变量Where 子句

    我正在按照 Scott Gu 的文章创建动态 LINQhttp weblogs asp net scottgu archive 2008 01 07 dynamic linq part 1 using the linq dynamic qu
  • 是否有更好(更简单)的方法来获取特定域 SID?

    我被指派修改 WinForms 应用程序 主要检查登录用户是否属于特定域 这是我到目前为止所想出的 byte domainSid var directoryContext new DirectoryContext DirectoryCont
  • 输入缓冲区刷新

    考虑下面的代码 include
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • 如何检查是否发生溢出? [复制]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 从 Linq 的列表中选择多个字段

    在 ASP NET C 中 我有一个结构 public struct Data public int item1 public int item2 public int category id public string category
  • 将 libpng 链接到 android 原生项目

    我在尝试在本机 Android 项目中加载 libpng 时遇到问题 编译器似乎无法识别 libpng 函数 但可以识别类型 如 png byte 它可以正常编译类型 但如果我添加函数 则会抛出错误 这是编译输出 Windows 7 cmd
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • “sizeof”对不完整类型列表结构 C 的无效应用

    我正在尝试实现一种处理页面错误的替换算法 因此 我尝试使用 malloc 创建一个循环链表 但出现以下错误 无效的应用程序sizeof to incomplete typepageInMemory 以下是代码 typedef struct
  • System.Drawing.Icon 构造函数抛出“操作成功完成”异常

    在 Windows XP 计算机上 以下代码抛出 System ComponentModel Win32Exception 并显示消息 操作成功完成 System Drawing Icon icon new System Drawing I
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • C中的pipe()和fork()

    我需要创建两个子进程 一个子进程需要运行命令 ls al 并将其输出重定向到下一个子进程的输入 而下一个子进程又将对其输入数据运行命令 sort r n k 5 最后 父进程需要读取该数据 已排序的数据 并将其显示在终端中 终端中的最终结果
  • 访问 Visual Studio 扩展中的当前代码窗格

    我正在编写一个 Visual Studio 2010 扩展 在代码视图中带有右键单击菜单 我希望能够从菜单项事件处理程序检查当前代码 但无法在对象模型中找到执行此操作的位置 如何在 Visual Studio 扩展中访问当前窗口中的代码 E
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi

随机推荐