使用OpenGL 实现一个实心小球沿矩形均速运动代码
时间: 2024-05-15 08:19:14 浏览: 85
OpenGL实现物体运动
4星 · 用户满意度95%
以下是使用OpenGL实现一个实心小球沿矩形均速运动的代码:
```c++
#include <GL/glut.h>
// 矩形的左上角坐标和右下角坐标
const float rectLeft = -0.5f;
const float rectTop = 0.5f;
const float rectRight = 0.5f;
const float rectBottom = -0.5f;
// 小球的半径
const float ballRadius = 0.1f;
// 小球的初始位置和速度
float ballX = -0.4f;
float ballY = 0.4f;
float ballSpeedX = 0.01f;
float ballSpeedY = 0.01f;
// 绘制矩形
void drawRect() {
glBegin(GL_QUADS);
glVertex2f(rectLeft, rectTop);
glVertex2f(rectRight, rectTop);
glVertex2f(rectRight, rectBottom);
glVertex2f(rectLeft, rectBottom);
glEnd();
}
// 绘制小球
void drawBall() {
glBegin(GL_TRIANGLE_FAN);
glVertex2f(ballX, ballY);
for (int i = 0; i <= 360; i++) {
glVertex2f(ballX + ballRadius * cosf(i * 3.1415926f / 180.0f),
ballY + ballRadius * sinf(i * 3.1415926f / 180.0f));
}
glEnd();
}
// 绘制场景
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 1.0f, 1.0f);
drawRect();
glColor3f(1.0f, 0.0f, 0.0f);
drawBall();
glutSwapBuffers();
}
// 更新小球位置
void updateBall() {
ballX += ballSpeedX;
ballY += ballSpeedY;
if (ballX - ballRadius < rectLeft || ballX + ballRadius > rectRight) {
ballSpeedX = -ballSpeedX;
}
if (ballY - ballRadius < rectBottom || ballY + ballRadius > rectTop) {
ballSpeedY = -ballSpeedY;
}
}
// 定时器回调函数,每隔一段时间更新一次小球位置
void timer(int value) {
updateBall();
glutPostRedisplay();
glutTimerFunc(16, timer, 0);
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(400, 400);
glutCreateWindow("Ball in Rectangle");
glutDisplayFunc(display);
glutTimerFunc(0, timer, 0);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glutMainLoop();
return 0;
}
```
在这个代码中,我们使用OpenGL画出了一个矩形和一个小球,并且让小球在矩形内均速运动。我们使用定时器来每隔一段时间更新一次小球的位置,然后重新绘制场景。在更新小球位置时,我们需要检测小球是否碰到了矩形的边界,如果碰到了则改变小球的速度方向。
阅读全文