这是计算机图形学基础的一道单元练习题,看题的时候觉得没什么,写出来才发现其中大有门道,其中有几个值得关注的地方:

  • 首先如果你是以窗口底部为地面的话,你会发现小球在第二次下落时无法回弹,这就很恶心了,做了很多无谓的尝试查了一些资料最后也只是找到了一个合适的位置让小球可以一直下落和回弹。
  • 还有一个细节就是我初始化小球y坐标为9.0001,而其回弹的最高位置是9.0,如果初始化小球y坐标也是9.0,小球仍然会出现上面那种情况。
  • 其次就是在模拟重力加速度以及放入实际的牛顿那个重力公式中的时候,方向很重要,注意是速度的方向在回弹和下落初的变换,重力加速度始终是向下的。
  • 最后就是用glutTimerFunc(2, timer, 0);指定定时器回调函数让小球自己去动。计算自由下落公式的相隔时间是2ms。所以把计时器也设为2ms吧。效果还不错。

为了看看是不是真的自由下落没有损失,我还在起始点和终点画了两条红线便于观察:

代码:

#include <windows.h>
#include <GL/freeglut.h>
#define G 9.8
bool direction = true;
double t = 0.002;
struct Ball{//球的结构体GLdouble y;GLdouble vy;
};
Ball ball;
void init(void){//初始化球体属性ball.y = 9.00001 ; ball.vy = 0.0 ;glClearColor(0.0,0.0,0.0,0.0);}
void display(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();glColor3f(1.0,0.0,0.0);glBegin(GL_LINES);glVertex2f(-5.0,9.0);glVertex2f(5.0,9.0);glVertex2f(-5.0,-3.0);glVertex2f(5.0,-3.0);glEnd();glColor3f(1.0,1.0,0.0);glTranslated(0,ball.y,0); //将绘图中心移动到球体的中心glutSolidSphere(0.5,50,50); //绘制一个球体if(direction){ball.y = ball.y-(ball.vy*t+0.5*G*t*t); //根据牛顿运动定律计算出球的位移公式ball.vy = ball.vy + G*t; //根据牛顿运动定律计算出球体的速度if(ball.y <=-3.0){ direction = false; //触发转向条件,改变direction的值,使球体运动方向改变 } }else{ ball.y = ball.y + (ball.vy*t-0.5*G*t*t); ball.vy = ball.vy-G*t; if(ball.y >= 9.0){direction = true;}}glPopMatrix();//交换前后缓冲区glutSwapBuffers();
}
void timer(int value)
{glutPostRedisplay();glutTimerFunc(2,timer, 0);
}
void reshape(int w,int h){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-15,15,-15*(GLfloat)h/(GLfloat)w,15*(GLfloat)h/(GLfloat)w,-15,15);elseglOrtho(-15*(GLfloat)h/(GLfloat)w,15*(GLfloat)h/(GLfloat)w,-15,15,-15,15);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}
int main(int argc,char** argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(600,600);glutInitWindowPosition(450,100);glutCreateWindow("小球自由落体");init();glutDisplayFunc(display);glutReshapeFunc(reshape);//永动机glutTimerFunc(2, timer, 0);glutMainLoop();return 0;
}

在OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面后能够返回原来高度相关推荐

  1. Unity2D中代码创建一个龙骨动画(DragonBones)并换装

    一:如何兼容使用龙骨动画 请参考https://www.cnblogs.com/NightFrost/p/9585296.html 插件下载地址https://github.com/DragonBon ...

  2. react中创建一个组件_如何使用React和MomentJS创建一个Countdown组件

    react中创建一个组件 Recently I had to create a Countdown for one of my other projects, and I thought that i ...

  3. 如何在React Native中创建精美的动画加载器

    by Vikrant Negi 通过Vikrant Negi 如何在React Native中创建精美的动画加载器 (How to create a beautifully animated load ...

  4. 如何在Joomla中创建一个漂亮的单页网站

    我们都知道一个好的网站对于建立企业信誉的重要性.但是,在拥有统一的单页网站和多页网站的选项之间进行选择可能会很棘手.特别是如果您是 Joomla 和 Web 开发的新手. 随着移动和社交媒体用户的增加 ...

  5. OPenGL笔记--创建一个3D场景

    文章目录 一.前言 二.效果展示 三.详细流程 3.1.World.txt文件规则 3.2.加载World.txt 3.3.绘制场景 3.4.交互 四.详细代码 五.举一反三 一.前言 通过前面的学习 ...

  6. 学习用C#在Unity中创建一个2D Metroidvania游戏

    学习用C#在Unity中创建一个2D Metroidvania游戏 你会学到: 构建2D Unity游戏 用C#编程 玩家统计,水平提升,米尔和远程攻击 敌方人工智能系统 制定级别和级别选择 Lear ...

  7. 学会在Unity中创建一个Match-3益智游戏 Learn To Create a Match-3 Puzzle Game in Unity

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:48场讲座(6h 38m) |大小解压后:2.8 G ...

  8. 如何在 Python 中创建一个简单的神经网络

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 在过去的几十年里,机器学习对世界产生了巨大的影响,而且它的普 ...

  9. 在Objective-C中创建一个抽象类

    我原来是一名Java程序员,现在使用Objective-C. 我想创建一个抽象类,但在Objective-C中似乎不可能. 这可能吗? 如果没有,我可以在Objective-C中获得一个抽象类的接近程 ...

最新文章

  1. 加密连接工具Cryptcat
  2. opencv mat相关资料整理
  3. Linux TCP拥塞控制算法原理解析
  4. python基础代码库-python3.4第三方库的安装?python基础代码库
  5. Css Div半透明
  6. wpf中的点击窗口放大放小按钮怎么写_Python tkinter教程01:创建窗口
  7. javamail “535 5.7.3 Authentication unsuccessful“ 问题排查
  8. Adobe 发布十月补丁日仅为修复一个严重漏洞
  9. Javaweb开发之git资料
  10. CTF web题常用解题工具
  11. WPS Office 2005个人版试用
  12. java功能模块_系统功能模块详解 java应该学习什么?
  13. 前端工程师的摸鱼日常(13)
  14. D3D9 3D渲染图像变模糊
  15. PPT使用技巧 一 更改幻灯片版式
  16. 51单片机基础——数码管数组动态显示0—F
  17. 阿里云服务器被攻击了
  18. linux桌面应用软件,ubuntu16.04-18.04 桌面应用软件推荐系列(一)
  19. 乐高 计算机泡泡龙教案,科学小实验----有趣的泡泡龙
  20. python抓取微博热搜列表

热门文章

  1. 多重剪贴板工具 CLCL
  2. Python也能识别图文,看到好的文章就用它一键扫描吧
  3. 前端加载自定义字体及速度优化
  4. FLutter web app 运行显示空白页
  5. 经常使用传感器协议1:CJ/T-188 水表协议解析1
  6. (ROC-RK3568-PC) 裸机24_驱动VOP2显示自绘画面
  7. Speedoffice 两个方法教你如何在Word文档中划线
  8. Android开发样式问题总结【持续更新】
  9. 5G通信技术及技术特点
  10. MATLAB App Designer 计算器的设计