OpenGL绘制自由落体的小球

#include <GL/glut.h>
#include<stdlib.h>
#include<iostream>
#include<ctime>
#include<cmath> 
#define PI 3.1415926 
double move=20.0; 
int i=0;
int down =1; 
int count=1;
double timeSpan = 0;    //下降到底所需时间    
double movey =0.0;
double duration = 0.0;    //持续时问    
double length =0.0; 
clock_t start,end; 
void init(){
    GLfloat mat_specular[] ={ 220.220,220.0,220.0,220.0 }; 
    GLfloat mat_shininess[] = {100.0};
    GLfloat light_position[] = {0.0, 0.0,0.0, - 2.0};
    GLfloat ambientLight[] ={ 0.2f, 0.2f, 0.2f, 1.0f }; 
    GLfloat diffuseLight[]={ 0.6f, 0.6f, 0.6f, 1.0f }; 
    GLfloat specular[] = { 1.0f, 1.0f, 1.0f,1.0f };
    glClearColor(0.2, 0.2, 1.5, 2.0);
    glColor3ub(100,100,215); 
    glShadeModel(GL_SMOOTH);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight), 
    glLightfv(GL_LIGHT0, GL_SPECULAR, specular); 
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
}

void reshape(int w, int h)
{
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)
        glOrtho(-12, 12, -12 * (GLfloat)(h) / (GLfloat)(w), 12 * (GLfloat)(h) / (GLfloat)(w), -1.0, 1.0);
    else
        glOrtho(-12 * (GLfloat)(w) / (GLfloat)(h), 12 * (GLfloat)(w) / (GLfloat)(h), -12, 12, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
void initDisplay()
{
    down = 1;    //向下运动    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0, 20.0, 0.0);
    glutSolidSphere(0.4, 40, 50);
    glutSwapBuffers();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0, move, 0.0);
    glutSolidSphere(0.4, 40, 50);
    glutSwapBuffers();
}
void MoveSphereUp()
{
    end = clock();
    duration = (double)(end - start - 16.0) / CLOCKS_PER_SEC;
    length = 5 * (timeSpan - duration) * (timeSpan - duration);
    move = 20 - length;
    if (move > 19.932) {
        move = 20;
        down = 1;
        printf("%i", down);
        start = clock();
    }
    display();
    glLoadIdentity();
}
void MoveSphereDown()
{
    if (count == 1) {
        start = clock();
        count = 0;
    }
    end = clock();
    duration = (double)(end - start) / CLOCKS_PER_SEC;
    length = 5 * duration * duration;
    move = 20 - length;
    if (move < -20)
    {
        timeSpan = duration;    //记下下降所经历的时间    
        move = -20;
        start = clock();
        down = 0;    //向上运动
    }
    display();
    glLoadIdentity();
}
void TimerFunc2(int value) 
{
    if (i == 0)
    {//left
        GLfloat light_position[] = { 12.0, 0.0, 0.0, 0.0
        };//T-Iu-d f-b 
        glLightfv(GL_LIGHT0, GL_POSITION,light_position);
    }
    if (i == 1)
    {//left-up
        GLfloat light_position[] = { 2.0,2.0,0,0,0.0 };//r-1u-d f-b 
        glLightfv(GL_LIGHT0, GL_POSITION,light_position);
    } 
    if (i == 2) 
    { //up
        GLfloat light_position[] ={0.0, 2.0, 0.0, 0.0};
        glLightfv(GL_LIGHT0, GL_POSITION,light_position);
            
    }
    if (i == 3)
    {//up-right
        GLfloat light_position[] = { -2.0, 2.0, 0.0, 0.0 };
        glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    }
    if (i == 4)
    {//right
        GLfloat light_position[] = { -2.0,0.0,0.0,0.0 };
        glLightfv(GL_LIGHT0, GL_POSITION,light_position);
    }
    if (i == 5)
    {//right-down
        GLfloat light_position[] = { -2.0,-2.0,0.0,0.0 };
        glLightfv(GL_LIGHT0, GL_POSITION,light_position);
    }
    if (i == 6)
    {//down
        GLfloat light_position[] = { 0.0, -2.0,0.0,0.0 };
        glLightfv(GL_LIGHT0, GL_POSITION,light_position);
    }
    if (i == 7)
    {//down-left
        GLfloat light_position[] = { 2.0,-2.0,0.0,0.0 };
        glLightfv(GL_LIGHT0, GL_POSITION,light_position);
    }
    i = (++i) % 8;    //控制小球旋转的    
    glutTimerFunc(60, TimerFunc2, 1);
}
void TimerFunc1(int value)
{
    if (down == 1)
    {
        MoveSphereDown();
    }
    if (down == 0) {
        MoveSphereUp();
    }
    glutTimerFunc(10,TimerFunc1, 0);
}
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(400, 740);
    glutInitWindowPosition(300, 20);
    glutCreateWindow(argv[0]);
    init();
    glutDisplayFunc(initDisplay);
    glutReshapeFunc(reshape);
    glutTimerFunc(1400, TimerFunc1, 0);//毫
    glutTimerFunc(400, TimerFunc2, 1);//毫秒
    glutMainLoop();
    return 0;
}

                        
 

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验一 OpenGL+GLUT开发平台搭建 5 小实验1: 开发环境设置 5 小实验2: 控制窗口位置和大小 6 小实验3:默认的可视化范围 6 小实验4:自定义可视化范围 7 小实验5: 几何对象变形的原因 8 小实验6: 视口坐标系及视口定义 8 小实验7:动态调整长宽比例,保证几何对象不变形 9 实验二 动画和交互 10 小实验1: 单缓冲动画技术 10 小实验2: 双缓冲动画技术 11 小实验3:键盘控制 13 小实验4:鼠标控制【试着单击鼠标左键或者右键,试着按下鼠标左键后再移动】 14 实验三 几何变换、观察变换、三维对象 16 小实验1:二维几何变换 16 小实验2:建模观察(MODELVIEW)矩阵堆栈 17 小实验3:正平行投影1 19 小实验4:正平行投影2 19 小实验5:正平行投影3 20 小实验6:透射投影1 21 小实验6:透射投影2 22 小实验7:三维对象 24 实验四 光照模型和纹理映射 26 小实验1:光照模型1----OpenGL简单光照效果的关键步骤。 26 小实验2:光照模型2----光源位置的问题 28 小实验3:光照模型3----光源位置的问题 31 小实验4:光照模型4----光源位置的问题 33 小实验5:光照模型5----光源位置的问题 35 小实验6:光照模型6----光源位置的问题 38 小实验7:光照模型7----光源位置的动态变化 40 小实验8:光照模型8----光源位置的动态变化 43 小实验9:光照模型9---光源位置的动态变化 45 小实验10:光照模型10---聚光灯效果模拟 48 小实验11:光照模型11---多光源效果模拟 50 小实验12:光照效果和雾效果的结合 53 小实验13:纹理映射初步—掌握OpenGL纹理映射的一般步骤 56 小实验13:纹理映射—纹理坐标的自动成(基于参数的曲面映射) 59 小实验14:纹理映射—纹理坐标的自动成(基于参考面距离) 61

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值