显示太阳 地球 月亮简单动画
平台:在VS2008+UCOSII286+openGL上显示
实现:创建2个任务
App_TaskStart 对变量day做++操作
GL_TaskStart 根据day的值绘制不同的图像,实现动画
编者:张永辉2012年11月17日
OPENGL部分参考:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html
/********************************************************************************************************
* INCLUDE FILES
********************************************************************************************************/
#include <GL/glut.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glut32.lib")
#include <includes.h>
OS_STK AppStartTaskStk[APP_OS_CFG_START_TASK_STK_SIZE];
OS_STK GLTaskStk[256];
static void App_TaskStart (void);
void GL_TaskStart (void);
/********************************************************************************************************
* INCLUDE FILES
********************************************************************************************************/
int main (void)
{
INT8U err;
OSInit();
OSTaskCreate((void (*)(void *)) App_TaskStart,
(void * ) 0,
(OS_STK * )&AppStartTaskStk[APP_OS_CFG_START_TASK_STK_SIZE-1],
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
OSTaskCreate((void (*)(void *)) GL_TaskStart,
(void * ) 0,
(OS_STK * )&GLTaskStk[256-1],
(INT16U )10);
#if (OS_TASK_NAME_SIZE >= 5) //Give a name to tasks
OSTaskNameSet(OS_TASK_IDLE_PRIO,"Idle",&err); //默认的Idle任务
#endif
OSStart(); // Start OS
}
/********************************************************************************************************
* 第一个任务 App_TaskStart()
********************************************************************************************************/
static int day = 200; // day的变化:从0到359
void App_TaskStart (void)
{
#if OS_TASK_STAT_EN > 0
OSStatInit(); // Determine CPU capacity
#endif
while (1)
{
printf("Delay 1 second and print\n");
OSTimeDlyHMSM(0, 0, 0, 100);
if ( day++ >=356) //使其旋转
{
day = 0;
}
}
}
/********************************************************************************************************
* 第二个任务 GL_TaskStart
********************************************************************************************************/
void myDisplay(void); //显示处理回调函数
void myIdle(void); //CPU空闲时自动回调用的函数
void GL_TaskStart (void)
{
#if OS_TASK_STAT_EN > 0
OSStatInit(); // Determine CPU capacity
#endif
OSTimeDlyHMSM(0, 0, 2, 0);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); // 修改了参数为GLUT_DOUBLE
glutInitWindowPosition(100, 100);
glutInitWindowSize(480, 320);
glutCreateWindow("太阳,地球和月亮"); // 改了窗口标题
glutDisplayFunc(&myDisplay);
glutIdleFunc(&myIdle); // 新加入了这句
glutMainLoop();
while (1)
{
printf("Delay 2 second and print\n");
OSTimeDlyHMSM(0, 0, 2, 0);
}
}
void myDisplay(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75, 1, 1, 400000000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1);
// 绘制红色的“太阳”
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(69600000, 20, 20);
// 绘制蓝色的“地球”
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(150000000, 0.0f, 0.0f);
glutSolidSphere(15945000, 20, 20);
// 绘制黄色的“月亮”
glColor3f(1.0f, 1.0f, 0.0f);
glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(38000000, 0.0f, 0.0f);
glutSolidSphere(4345000, 20, 20);
glFlush();
glutSwapBuffers();
}
void myIdle(void)
{
/* 新的函数,在空闲时调用,作用是把日期往后移动一天并重新绘制,达到动画效果 */
myDisplay();
}