OpenGL小探1


/* OpenGL包含了许多渲染函数,但是的设计目的是独立于任何窗口系统或操作系统,因此它并没有打开窗口或从键盘或鼠标读取事件的函数。
可以使用GLUT,GLUT还包含了一些函数,用于创建更为复杂的三维物体,如球体,圆环面和茶壶。
若要编写功能完整的OpenGL应用程序,GLUT可能无法满足要求,但是GLUT可以作为学习OpenGL非常好的起点。 */
窗口管理:
    GLUT 通过几个函数执行初始化窗口所需要的任务:
* glutInit(int *argc, char **argv) 对GLUT进行初始化,并处理所有的命令行参数。在调用其他任何GLUT函数之前调用。
* glutInitDisplayMode(unsigned int mode) 指定了使用RGBA模式还是颜色索引模式.若使用颜色索引,需用glutSetColor()
    把颜色加载到颜色映射表中。eg:glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
* glutInitWindowPosition(int x,int y) 指定了窗口左上角的屏幕位置
* glutInitWindowSize(int width,int size) 指定了窗口的大小
* glutInitContextVersion(int majorVersion,int minorVersion) 声明使用OpenGL的哪个版本
* glutInitContextFlags(int flags) 声明使用的OpenGL渲染环境的类型
* int glutCreateWindow(char *string) 创建一个支持OpenGL渲染环境的窗口,返回一个唯一的标示符,表示这个窗口。
    在调用glutMainLoop()函数之前,这个窗口并没有显示。
最重要的事件回调函数:
    glutDisplayFunc(void (*func)(void)), 每当GLUT确定一个窗口的内容需要重新显示时,通过glutDisplayFunc()注册的回调函数就会运行
    如果程序修改了窗口的内容,有时可能需要调用glutPostRedisplay(),这个函数会指示glutMainLoop()调用已注册的显示回调函数。
运行程序:
    必须调用glutMainLoop()来启动程序,所有已创建的窗口将会在这时显示,对窗口渲染开始生效,事件处理循环开始启动,已注册的显示回调函数
    被触发,一旦进入循环,永不会退出。
//使用GLUT的OpenGL示例:hello.c
#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
 
void display(void){
    glClear(GL_COLOR_BUFFER_BIT); //清除所有像素
    glColor3f(1.0,1.0,1.0); //白色
 
    glBegin(GL_POLYGON);
    glVertex3f(0.25,0.25,0.0);
    glVertex3f(0.75,0.25,0.0);
    glVertex3f(0.75,0.75,0.0);
    glVertex3f(0.25,0.75,0.0);
    glEnd();
 
    glFlush();
}
 
void init(void){
    glClearColor(0.0,0.0,0.0,0.0); //选择清除(背景)颜色
    glMatrixMode(GL_PROJECTION);  //指定哪一个矩阵为当前矩阵,
    glLoadIdentity();	//用有身份的矩阵替换当前矩阵
    glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0); //当前坐标系统
}
 
int main(int argc,char **argv){
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(250,250);
    glutInitWindowPosition(100,100);
    glutCreateWindow("hello");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
 
处理输入事件:
*    glutReshapeFunc(void(*func)(int w,int h))表示当窗口的大小改变时应该采取什么行动;
*   glutKeyboardFunc(void(*func)(unsigned char key,int x, int y))和
*   glutMouseFunc(void(*func)(int button,int state,int x,int y)) 允许把键盘上的一个键或鼠标上的一个按钮与一个函数
    相关联,当键或按钮被按下或吃放时,这个函数就会被调用。
*   glutMotionFunc(void(*func)(int x, int y)) 当按下一个鼠标按钮移动鼠标时,函数被调用。
空闲处理:
    在glutIdleFunc(void(*func)(void))回调函数中指定一个函数,若不存在其他尚未完成的事件就执行这个函数;若传递NULL,表示禁用此函数。


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGL中可以通过改变小球的位置来实现小球触边反弹的效果。当小球触碰到边界时,我们需要检测小球的位置,如果小球超过边界,则将小球的位置调整为边界的位置,并将小球的速度取反,使其开始反弹移动。 首先,我们需要设定小球的初始位置、半径和速度,以及边界的位置。可以使用OpenGL中的坐标系和数学函数来表示这些参数。 在OpenGL渲染循环中,我们需要在每次循环中更新小球的位置。通过检查小球的位置是否超过边界,可以实现小球的反弹效果。 具体的算法如下: 1. 初始化小球的位置、半径和速度,以及边界的位置。 2. 在每一帧中,更新小球的位置,即根据小球的速度和时间增量更新小球的坐标。例如,可以使用小球的x坐标加上速度乘以时间增量,以获得新的x坐标。 3. 检查小球是否超过边界。可以通过比较小球的位置和边界的位置来判断。如果小球的x坐标超过边界的x范围,则说明小球触碰到了左右边界。此时,将小球的x坐标调整为边界的x范围,并将小球的x速度取反,使小球开始反弹移动。 4. 同样地,检查小球的y坐标是否超过上下边界的范围。如果超过了边界,就进行相应的调整和速度的取反。 5. 最后,根据更新后的小球位置和速度,在OpenGL中绘制小球。 通过这个算法,我们可以实现小球触边反弹的效果。每当小球触碰到边界时,它会反弹,改变移动的方向。这样,我们就可以模拟出小球触碰到边界后反弹运动的动画效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值