使用OpenGL 实现一个实心小球沿矩形均速运动代码
时间: 2024-05-12 20:16:30 浏览: 76
以下是使用OpenGL实现一个实心小球沿矩形均速运动的代码:
```c++
#include <GL/glut.h>
float ballX = 50.0f;
float ballY = 50.0f;
float ballRadius = 10.0f;
float ballSpeedX = 1.0f;
float ballSpeedY = 1.0f;
float rectLeft = 20.0f;
float rectRight = 80.0f;
float rectTop = 80.0f;
float rectBottom = 20.0f;
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
// 绘制矩形
glColor3f(0.0f, 0.0f, 1.0f);
glBegin(GL_QUADS);
glVertex2f(rectLeft, rectTop);
glVertex2f(rectRight, rectTop);
glVertex2f(rectRight, rectBottom);
glVertex2f(rectLeft, rectBottom);
glEnd();
// 绘制小球
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLE_FAN);
glVertex2f(ballX, ballY);
for (int i = 0; i <= 360; i++)
{
float angle = i * 3.14159f / 180.0f;
float x = ballX + ballRadius * cos(angle);
float y = ballY + ballRadius * sin(angle);
glVertex2f(x, y);
}
glEnd();
glutSwapBuffers();
}
void update(int value)
{
// 更新小球位置
ballX += ballSpeedX;
ballY += ballSpeedY;
// 检测小球是否碰到矩形边界
if (ballX + ballRadius > rectRight) // 右边界
{
ballX = rectRight - ballRadius;
ballSpeedX = -ballSpeedX;
}
else if (ballX - ballRadius < rectLeft) // 左边界
{
ballX = rectLeft + ballRadius;
ballSpeedX = -ballSpeedX;
}
if (ballY + ballRadius > rectTop) // 上边界
{
ballY = rectTop - ballRadius;
ballSpeedY = -ballSpeedY;
}
else if (ballY - ballRadius < rectBottom) // 下边界
{
ballY = rectBottom + ballRadius;
ballSpeedY = -ballSpeedY;
}
glutPostRedisplay();
glutTimerFunc(16, update, 0);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutCreateWindow("OpenGL Example - Ball in Rect");
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glutDisplayFunc(display);
glutTimerFunc(0, update, 0);
glutMainLoop();
return 0;
}
```
该代码使用OpenGL绘制了一个矩形和一个实心小球,小球沿着矩形均速移动。在update函数中,通过更新小球的位置和检测小球与矩形边界的碰撞来实现小球沿矩形均速运动的效果。