计算机图形学实验(OpenGL实现):Spinning Pinwheel

实验要求:

  1. 构建且渲染一个3D风车模型(如下图所例示)。其中,三个叶片(包括中间的黄色三角形)在一个2D平面上,手柄在另外一个离相机更近的2D平面上。三个叶片、中心的三角形、手柄分别用不同的颜色显示。注:图中画的黑色线条是为了方便演示,不要求绘制。
    在这里插入图片描述

  2. 实现风车的旋转动画。要求风车的三个叶片以及中间的黄色三角形(在其所在平面上)一起绕着中心一点不停旋转,且将此动画渲染出来。

  3. 实现通过键盘对动画的交互控制,包括切换旋转方向、增大旋转速度以及减小旋转速度。

  4. 设计按钮和菜单两个控件,用于动画的交互控制:点击按钮可以切换旋转方向;选择三个菜单项分别可以切换旋转方向、增大旋转速度以及减小旋转速度。


实现思路:

  1. 绘制部分:绘制风车各种元素,如三个扇叶、中间的三角形,风车把,按钮,按钮上的提示文字等
  2. 交互部分:鼠标点击按钮的效果,键盘交互的效果,鼠标右键呼叫菜单栏的效果
  3. 风车运动部分:保持旋转的功能,加速功能,减速功能,逆转方向功能

(另外:注意一些基本函数的使用要点,如旋转函数,位移函数等等,不再赘述)


实现代码:

//my solution
#include <iostream>
#include <string>
#include <cmath>
#include <Windows.h>
#include <Gl/glut.h> 
#define MAX_CHAR 128

using namespace std;

double Rdgr = 0;//rotate degree
double velocityAcc = 0;//acceleration of velocity
double incresement = 0.3;


//function part(speed constro & spining direction reverse)
void reverse()
{
   
    velocityAcc = -velocityAcc;
}

void speedUp()
{
   
    if (velocityAcc >= 0)velocityAcc += incresement;
    else velocityAcc -= incresement;
}

void speedDown()
{
   
    if (velocityAcc >= 0) velocityAcc -= incresement;
    else velocityAcc += incresement;
}

void rotate()
{
   
    Rdgr += velocityAcc;
    if (Rdgr > 360) Rdgr = 0;
    glutPostRedisplay();
}

//button part
void printCharater(const char* str)
{
   
    glRasterPos2f(-0.06, 0.74);
    for (int i = 0; i < strlen(str); i++) glutBitmapCharacter(GLUT_BITMAP_8_BY_13, *(str + i));
}

void mouseFunc(GLint btn, GLint sta, int x, int y)
{
   
    if (btn == GLUT_LEFT_BUTTON && sta == GLUT_DOWN)
        if (x >= 360 && x <= 440 && y >= 40 && y <= 80) reverse();
    glutPostRedisplay();
}


//menu part
void subFunc(GLint data)
{
   
    switch (data)
    {
   
        case 1:speedUp(); break;
        case 2:speedDown(); break;
    }
}

void menuFunc(GLint data)
{
   
    if (data == 1) reverse();
}

void creatMenu()
{
   
    //创建子菜单
    GLint sub = glutCreateMenu(subFunc);
    glutAddMenuEntry("Speed Up", 1);
    glutAddMenuEntry("Speed Do
  • 4
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenGL是一种跨平台的图形编程接口,可以用于开发二维和三维动画。我在我的大作业中选择了使用OpenGL实现一个二维动画。 首先,我创建了一个窗口来展示我的动画。我使用了OpenGL的窗口管理函数来创建一个可视化的窗口,并设置了窗口的宽度和高度。 接下来,我使用OpenGL的2D绘图函数来绘制我的动画场景。我可以使用基本的2D形状(如矩形、圆形和三角形)来创建我的角色和背景。我还可以使用纹理映射来为我的角色和背景添加真实的图像。 为了使我的角色动起来,我使用了OpenGL的变换函数来实现平移、旋转和缩放。通过改变角色的位置和大小,我可以创建出各种动画效果,如移动、旋转和缩放。 除了角色的动作,我还可以使用OpenGL的颜色函数来为我的角色添加颜色和渐变效果。通过改变角色的颜色,我可以使它们在动画中呈现出不同的视觉效果。 最后,我使用了OpenGL动画函数来实现动画效果。我可以设置帧速率和动画的持续时间,使我的动画看起来更加流畅和连续。 总结起来,通过使用OpenGL的各种函数和特性,我可以在我的大作业中创建出一个精彩的二维动画。无论是角色的绘制、变换还是动作,我都可以通过OpenGL实现,并将它们呈现在一个可视化的窗口中。这个项目将帮助我更好地理解和应用OpenGL图形编程接口,并提升我的编程技能和创造力。 ### 回答2: OpenGL二维动画大作业是一个通过使用OpenGL图形库来实现二维动画效果的项目。在这个作业中,学生将学习如何使用OpenGL的图形函数和特性来创建各种动画效果。 在这个大作业中,学生需要实现一个可以展示连续动画的程序。他们可以选择一个或多个主题或场景,例如火箭发射、小球跳跃或汽车行驶。然后,他们将使用OpenGL来创建各种元素和对象,例如火箭、小球或汽车,并为它们添加适当的动画。 学生需要学习如何在OpenGL中创建和管理图形对象,例如点、线段、多边形和纹理。他们还需要了解OpenGL的变换和动画技术,例如平移、旋转和缩放,以及使用插值和补间函数来实现平滑动画过渡。 为了实现这些效果,学生可能需要编写自定义的顶点和片段着色器。这些着色器是用于控制OpenGL如何处理图形对象并渲染它们的程序。 除了图形技术,学生还需要学习如何处理用户输入和交互,例如键盘和鼠标事件。他们可以实现一些互动功能,例如通过按下键盘上的特定键来触发动画或改变场景。 最后,学生还可以进一步提升他们的作业,例如添加音频效果或使用物理引擎来模拟真实世界的运动和碰撞。 总体而言,OpenGL二维动画大作业是一个通过实践来学习图形渲染动画技术的项目。通过完成这个作业,学生将加深对计算机图形学OpenGL的理解,并提高他们的编程和创造力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值