opengl写一个有字并实现二维变换
时间: 2024-05-11 17:14:42 浏览: 10
这里提供一个简单的OpenGL程序,实现了在屏幕上绘制一个“Hello World”字符串,并可以通过键盘输入实现平移、旋转和缩放变换。
```c++
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <string.h>
// 字符串
char *str = "Hello World";
int len;
// 窗口大小
int win_width = 800;
int win_height = 600;
// 字符串位置
int str_x = 0;
int str_y = 0;
// 缩放比例
float scale_x = 1.0f;
float scale_y = 1.0f;
// 旋转角度
float angle = 0.0f;
void display()
{
// 清除颜色缓存和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 保存当前的矩阵状态
glPushMatrix();
// 平移
glTranslatef(str_x, str_y, 0.0f);
// 旋转
glRotatef(angle, 0.0f, 0.0f, 1.0f);
// 缩放
glScalef(scale_x, scale_y, 0.0f);
// 绘制字符串
glColor3f(1.0f, 1.0f, 1.0f);
glRasterPos2i(0, 0);
for (int i = 0; i < len; i++)
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, str[i]);
// 恢复之前的矩阵状态
glPopMatrix();
// 交换缓冲区
glutSwapBuffers();
}
void reshape(int w, int h)
{
// 设置视口
glViewport(0, 0, w, h);
// 设置投影矩阵
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-w / 2, w / 2, -h / 2, h / 2);
// 设置模型矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
// 左移
case 'a':
str_x--;
break;
// 右移
case 'd':
str_x++;
break;
// 下移
case 's':
str_y--;
break;
// 上移
case 'w':
str_y++;
break;
// 逆时针旋转
case 'q':
angle++;
if (angle >= 360.0f)
angle -= 360.0f;
break;
// 顺时针旋转
case 'e':
angle--;
if (angle < 0.0f)
angle += 360.0f;
break;
// 放大
case '+':
scale_x += 0.1f;
scale_y += 0.1f;
break;
// 缩小
case '-':
scale_x -= 0.1f;
scale_y -= 0.1f;
if (scale_x < 0.1f)
scale_x = 0.1f;
if (scale_y < 0.1f)
scale_y = 0.1f;
break;
// 退出
case 27:
exit(0);
break;
}
// 重新绘制
glutPostRedisplay();
}
int main(int argc, char **argv)
{
// 初始化GLUT库
glutInit(&argc, argv);
// 设置窗口大小和显示模式
glutInitWindowSize(win_width, win_height);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
// 创建窗口
glutCreateWindow("OpenGL 2D Transform");
// 注册回调函数
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
// 计算字符串长度
len = strlen(str);
// 开始主循环
glutMainLoop();
return 0;
}
```
在该程序中,我们使用了OpenGL的平移、旋转和缩放函数来实现字符串的变换。具体来说,我们使用glTranslatef函数实现平移,glRotatef函数实现旋转,glScalef函数实现缩放。在每次变换后,我们都重新绘制一遍字符串。同时,我们还使用了glutKeyboardFunc函数来监听键盘输入,从而实现交互式变换。