opengl学习之 太阳系

#include <glut.h>
#include <math.h>
#define PI 3.141592
int rs = 80, re = 50, rm = 10;
int distSE = 190, distSM = 270;
int angleS = 0, angleE = 0, angleM = 0;
int angleES = 0, angleME = 0, angleMS = 0;

void Display(void);
void Reshape(int w, int h);
void mytime(int value);
void myinit(void);
void sun(void);
void earth(void);
void moon(void);
void selectFont(int size, int charset, const char* face); //选择字体
void drawCNString(const char* str); //生成中文字体函数


int APIENTRY _tWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR    lpCmdLine,
    int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    char *argv[] = { "hello ", " " };
    int argc = 2; // must/should match the number of strings in argv
    glutInit(&argc, argv);  //初始化GLUT库;
    glutInitWindowSize(600, 600);  //设置显示窗口大小
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);  //设置显示模式;(注意双缓冲)
    glutInitWindowPosition(300, 50);//初始位置
    glutCreateWindow("A Rotating Sun System"); // 创建显示窗口
    myinit();
    glutDisplayFunc(Display);  //注册显示回调函数
    glutReshapeFunc(Reshape);  //注册窗口改变回调函数
                               //glutIdleFunc(Display);    //空闲回调函数
    glutTimerFunc(200, mytime, 10);
    glutMainLoop();  //进入事件处理循环
    return 0;
}

void myinit()
{
    glLineWidth(4);
    glPointSize(12);

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    glEnable(GL_POINT_SMOOTH);
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
    glEnable(GL_LINE_SMOOTH);
    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
    glEnable(GL_POLYGON_SMOOTH);
    glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);

}

void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下
    glLoadIdentity();   //将当前矩阵设置为单位矩阵
    angleS++;
    angleE++;
    angleM++;
    angleES++;
    angleMS++;
    angleME++;
    sun();
    earth();
    moon();

    glutSwapBuffers();   //双缓冲的刷新模式;
}

void sun()
{
    glPushMatrix();
    glColor3f(1, 0, 0);

    glRotatef(angleS, 0, 0, 1);
    glutWireSphere(rs, 40, 40);

    glColor3f(1, 1, 0);
    glBegin(GL_POINTS);
    glVertex2f(rs, 0);
    glEnd();

    selectFont(40, GB2312_CHARSET, "楷体_GB2312"); //设置字体楷体48号字
    glRasterPos2f(0, 0);  //在世界坐标250,250处定位首字位置
    drawCNString("太阳");  //写字“Hello,大家好”

    glPopMatrix();
}
void earth()
{
    glPushMatrix();

    //公转
    glRotatef(angleES, 0, 0, 1);

    glColor3f(0, 0, 1);
    glTranslated(distSE, 0, 0);

    //自转
    glRotatef(angleE, 0, 0, 1);
    glutWireSphere(re, 40, 40);
    //点
    glColor3f(1, 1, 0);
    glBegin(GL_POINTS);
    glVertex2f(re, 0);
    glEnd();

    selectFont(24, GB2312_CHARSET, "楷体_GB2312"); //设置字体楷体48号字
    glRasterPos2f(0, 0);  //在世界坐标250,250处定位首字位置
    drawCNString("地球");  //写字“Hello,大家好”

    glPopMatrix();
}
void moon()
{
    glPushMatrix();
    
    //公转 -- 绕太阳and地球
    glRotatef(angleMS, 0, 0, 1);
    glTranslatef(distSE, 0, 0);
    glRotatef(angleME, 0, 0, 1);
    glTranslatef(-distSE, 0, 0);

    glColor3f(0, 1, 0);
    glTranslated(distSM, 0, 0);

    //自转
    glRotatef(angleM, 0, 0, 1);
    glutWireSphere(rm, 40, 40);

    glColor3f(1, 1, 0);
    glBegin(GL_POINTS);
    glVertex2f(rm, 0);
    glEnd();

    selectFont(12, GB2312_CHARSET, "楷体_GB2312"); //设置字体楷体48号字
    glRasterPos2f(10, 10);  //在世界坐标250,250处定位首字位置
    drawCNString("月球");  //写字“Hello,大家好”

    glPopMatrix();
}

void mytime(int value)
{

    glutPostRedisplay();  //重画,相当于10重新调用Display(),改编后的变量得以传给绘制函数

    glutTimerFunc(200, mytime, 10);

}
void Reshape(GLsizei w, GLsizei h)
{
    glMatrixMode(GL_PROJECTION);  //投影矩阵模式
    glLoadIdentity();  //矩阵堆栈清空
    glViewport(0, 0, w, h); //设置视区大小
                            //-distSM+3*rm
    gluOrtho2D(-(distSM + 3 * rm), distSM + 3 * rm, -(distSM + 3 * rm), distSM + 3 * rm);  //设置裁剪窗口大小  
    glMatrixMode(GL_MODELVIEW);  //模型矩阵模式

}

//* 选择字体函数                                                                    
void selectFont(int size, int charset, const char* face)
{
    HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
        charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face);
    HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont);
    DeleteObject(hOldFont);
}

//* 生成中文字体函数                                                                  
void drawCNString(const char* str)
{
    int len, i;
    wchar_t* wstring;
    HDC hDC = wglGetCurrentDC();
    GLuint list = glGenLists(1);

    // 计算字符的个数
    // 如果是双字节字符的(比如中文字符),两个字节才算一个字符
    // 否则一个字节算一个字符
    len = 0;
    for (i = 0; str[i] != '\0'; ++i)
    {
        if (IsDBCSLeadByte(str[i]))
            ++i;
        ++len;
    }

    // 将混合字符转化为宽字符
    wstring = (wchar_t*)malloc((len + 1) * sizeof(wchar_t));
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);
    wstring[len] = L'\0';

    // 逐个输出字符
    for (i = 0; i<len; ++i)
    {
        wglUseFontBitmapsW(hDC, wstring[i], 1, list);
        glCallList(list);
    }

    // 回收所有临时资源
    free(wstring);
    glDeleteLists(list, 1);
}

猜你喜欢

转载自blog.csdn.net/guanshanyue96/article/details/89040443