C语言 使用OpenGL 小球从高处沿直线下落到地面,反弹原高度的1/2再下落,再反弹1/2再落后静止
时间: 2024-05-09 21:21:40 浏览: 11
以下是一个简单的C语言程序,使用OpenGL绘制一个小球,并按照题目要求使其从高处沿直线下落到地面,反弹原高度的1/2再下落,再反弹1/2再落后静止。
```
#include <GL/glut.h>
#include <math.h>
#define PI 3.14159265358979323846
// 小球的初始位置和速度
GLfloat ballPosX = 0.0, ballPosY = 2.0, ballPosZ = 0.0;
GLfloat ballVelX = 0.0, ballVelY = -0.1, ballVelZ = 0.0;
// 小球的半径和颜色
GLfloat ballRadius = 0.3;
GLfloat ballColor[] = {1.0, 1.0, 0.0};
void drawBall()
{
glColor3fv(ballColor);
glPushMatrix();
glTranslatef(ballPosX, ballPosY, ballPosZ);
glutSolidSphere(ballRadius, 20, 20);
glPopMatrix();
}
void updateBall()
{
// 更新小球的位置和速度
ballPosX += ballVelX;
ballPosY += ballVelY;
ballPosZ += ballVelZ;
ballVelY -= 0.01; // 重力加速度为0.01
// 如果小球触碰到地面,则反弹
if (ballPosY < ballRadius)
{
ballPosY = ballRadius;
ballVelY = -ballVelY / 2.0;
}
// 如果小球速度很小,则停止运动
if (fabs(ballVelX) < 0.001 && fabs(ballVelY) < 0.001 && fabs(ballVelZ) < 0.001)
{
ballVelX = ballVelY = ballVelZ = 0.0;
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 5.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 设置视角
drawBall();
updateBall();
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 0.1, 100.0); // 设置透视投影
}
void timer(int value)
{
glutPostRedisplay();
glutTimerFunc(16, timer, 0); // 每隔16毫秒调用一次display函数
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(800, 600);
glutCreateWindow("OpenGL Ball");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(0, timer, 0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat lightPos[] = {1.0, 1.0, 1.0, 0.0};
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glutMainLoop();
return 0;
}
```
说明:
1. 程序中使用了OpenGL的基本函数和库,需要安装相关的开发环境。
2. 小球的初始位置和速度分别定义为ballPosX、ballPosY、ballPosZ和ballVelX、ballVelY、ballVelZ。
3. drawBall函数用于绘制小球,updateBall函数用于更新小球的位置和速度。
4. display函数用于绘制场景,包括调用drawBall函数和updateBall函数。
5. reshape函数用于设置视口和投影矩阵。
6. timer函数用于定时调用display函数。
7. 在主函数中,使用glutInit函数初始化OpenGL和GLUT库,创建窗口,注册回调函数,开启深度测试、光照和定时器等功能。
8. 小球的运动过程中,如果小球触碰到地面,则速度反向并除以2,模拟弹跳过程。当小球速度很小时,停止运动。
运行程序后,可以看到一个黄色的小球从高处落下,反弹1/2再落下,再反弹1/2最终静止在地面上。可以通过修改小球的初始位置和速度,改变小球的运动轨迹。