计算机图形学_3DsolarSys

一、软件功能

       1、实现3D太阳系,有太阳、土星、土星环、地球、月球、天王星、海王星、火星。其中土星、地球、天王星、海王星、火星绕着太阳转,土星环绕着土星转,月球绕着地球转。

2可以鼠标左、中、右任意键拖动太阳系观察。

3连续点击鼠标中键,太阳系整体绕z轴开始旋转并且速度加一;点击鼠标右键,连续点击中键,太阳系整体绕z轴开始旋转并且速度加一;点击鼠标左键,太阳系会立马停止转动。

4、按下键盘,O:取消轨道,P:显示轨道,U:视角上升,I:视角下降,Y:显示数轴,N:取消数轴,C:显示字符,V:取消字符,WSAD:控制相机移动。

5实现了太阳光照效果。

6、实现了星光。

二、实现

       myDisplay()显示函数,myIdle()设置全局回调函数,mouse()设置鼠标点击事件监听,motion()设置鼠标滑动事件监听,keyboard()设置键盘事件监听,selectFont()设置字体,drawCNString()生成中文字体。

实现星系

glEnable(GL_DEPTH_TEST);开启更新深度缓冲区。利用glutWireSphere()绘制线形球体或者利用glutSolidSphere()绘制实体球体。在绘制行星时需要进行坐标原点的迁移glTranslatef(),每次绘制的行星都是在上一个矩阵的基础上进行的偏移,所以在绘制行星前需要glPushMatrix()将太阳坐标矩阵压栈,在将要绘制行星时先将太阳坐标矩阵弹栈glPopMatrix(),而在绘制月球或者土星环时则无需弹栈。

实现鼠标拖动

void motion(int x, int y)传入鼠标参数值,anglex += 360 * (GLfloat)deltay / (GLfloat)WinW根据屏幕上鼠标滑动的距离来设置旋转的角度。

实现鼠标控制旋转

void mouse(int button, int state, int x, int y)传入鼠标参数值,if (button == GLUT_RIGHT_BUTTON&&state == GLUT_DOWN)判断哪一个键和状态,{isy = 0.0; isz = 1.0;}决定太阳是绕着哪个轴旋转或者rote = 0使其停止旋转。

实现键盘控制

void keyboard(unsigned char key, int x, int y)传入键盘参数,利用switch语句判断key类型,显示和取消类型的控制利用设置控制条件将其实现代码写入if语句中,视角的变换是控制glLookAt的eyez值实现的,控制相机移动是控制eyex和eyey值实现的。

实现太阳光照

glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);

glLightfv(GL_LIGHT0, GL_AMBIENT,   sun_light_ambient);

glLightfv(GL_LIGHT0, GL_DIFFUSE,   sun_light_diffuse);

glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);

定义光源位置、环境光、漫反射光、镜面光,{ glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); }开启光源。

GLfloat earth_mat_ambient[]   = {1.0f, 0.5f, 0.31f, 1.0f};  //定义材质的环境光颜色,偏蓝色

GLfloat earth_mat_diffuse[]   = {1.0f, 0.4f, 0.2f, 1.0f};  //定义材质的漫反射光颜色,偏蓝色

GLfloat earth_mat_specular[] = {1.0f, 0.0f, 0.0f, 1.0f};   //定义材质的镜面反射光颜色,红色

GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};   //定义材质的辐射光颜色,为0

GLfloat earth_mat_shininess   = 30.0f;     //定义太阳光强

定义星球的表面光照情况。

实现星光

glColor3f((rand()/(GLfloat)RAND_MAX),(rand()/(GLfloat)RAND_MAX),(rand()/(GLfloat)RAND_MAX));

glVertex3f((rand()/(GLfloat)RAND_MAX)*pow(-1,rand())*700,(rand()/(GLfloat)RAND_MAX)*pow(-1,rand())*700,(rand()/(GLfloat)RAND_MAX)*pow(-1,rand())*700);

随机画点颜色和位置

三、运行截图

四、代码

#include<Windows.h>
#include<GL\glut.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
//太阳、地球和月亮
//假设每个月都是30天
//一年12个月,共是360天
#define N 999
using namespace std;
static int day = ; // day的变化:从0到359
static float PI = 3.14159; GLfloat roate = 0.0;// set rote of roate ying yu bu hao bu zhuang le 设置旋转速率
GLfloat rote = 0.0;//shezhi旋转角度
GLfloat isy = 0.0;//太阳绕y轴旋转
GLfloat isz = 0.0;//太阳绕z轴旋转
GLfloat hasOrbit = 1.0f;
GLfloat hasCoordinate = 1.0f;
GLfloat hasCharacter = 1.0f;
GLfloat eyehight = 50.0;
GLfloat eyex = 0.0f;
GLfloat eyey = -; GLfloat anglex = 0.0;//X 轴旋转
GLfloat angley = 0.0;//Y 轴旋转
GLfloat anglez = 0.0;//Z 轴旋转
GLint WinW = ;
GLint WinH = ;
GLfloat oldx;//当左键按下时记录鼠标坐标
GLfloat oldy; void selectFont(int size, int charset, const char*face);
void drawCNString(const char* str); void myDisplay(void)
{
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(, , , ); glRotatef(anglex, 1.0, 0.0, 0.0);
glRotatef(angley, 0.0, 1.0, 0.0);
glRotatef(anglez, 0.0, 0.0, 1.0);
rote += roate;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyex, eyey, eyehight, , , , , , 1.0);
glPushMatrix();
// gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // 定义太阳光源,它是一种白色的光源
{
GLfloat sun_light_position[] = {0.0f, 0.0f, 0.0f, 1.0f}; //光源的位置在世界坐标系圆心,齐次坐标形式
GLfloat sun_light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f}; //RGBA模式的环境光,为0
GLfloat sun_light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f}; //RGBA模式的漫反射光,全白光
GLfloat sun_light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; //RGBA模式下的镜面光 ,全白光
glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular); //开启光源
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
}
if(hasCharacter==1.0f)
{
/*在绘制部分调用字体函数,写中文字*/
GLfloat sun_mat_emission[] = {0.1, 0.6, 0.3, 1.0f}; //定义材质的辐射广颜色
glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission); selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , -);//定位首字
drawCNString("测");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("V:取消字体");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("C:显示字体");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("O:取消轨道");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("P:显示轨道");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("I:下降视角");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("U:上升视角");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("Y:显示标轴");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("N:取消标轴");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("A:向左移动");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("D:向右移动");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("W:向前移动");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("S:向后移动");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("左键:移动行星");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("中键:绕X旋转");//写字
selectFont(, GB2312_CHARSET, "楷体GB2312");//设置字体
glRasterPos3f(-, , );//定位首字
drawCNString("右键:绕Y旋转");//写字
}
{//画星光
int i;
glPointSize();
glPopMatrix();
glBegin(GL_POINTS);
for(i=; i<; i++)
{
glColor3f((rand()/(GLfloat)RAND_MAX),(rand()/(GLfloat)RAND_MAX),(rand()/(GLfloat)RAND_MAX));
glVertex3f((rand()/(GLfloat)RAND_MAX)*pow(-,rand())*,(rand()/(GLfloat)RAND_MAX)*pow(-,rand())*,(rand()/(GLfloat)RAND_MAX)*pow(-,rand())*);
}
glEnd();
}
{
GLfloat sun_mat_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的环境光颜色,为0
GLfloat sun_mat_diffuse[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的漫反射光颜色,为0
GLfloat sun_mat_specular[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,为0
GLfloat sun_mat_emission[] = {0.8f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射广颜色,为偏红色
GLfloat sun_mat_shininess = 0.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, sun_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, sun_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, sun_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, sun_mat_shininess);
//绘制红色的“太阳”
glColor3f(1.0f, 0.0f, 0.0f);
glRotatef(rote, 0.0f, isy, isz);
glutWireSphere(, , );
glPushMatrix();//将太阳的变换矩阵压入栈
}
{
GLfloat earth_mat_ambient[] = {1.0f, 0.5f, 0.31f, 1.0f}; //定义材质的环境光颜色,偏蓝色
GLfloat earth_mat_diffuse[] = {1.0f, 0.4f, 0.2f, 1.0f}; //定义材质的漫反射光颜色,偏蓝色
GLfloat earth_mat_specular[] = {1.0f, 0.0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,棕色
GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0
GLfloat earth_mat_shininess = 50.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);
//绘制棕色的“土星”
glColor3f(0.7f, 0.5f, 0.0f);
glRotatef((((day+) / 360.0)*360.0)*, 0.0f, 0.0f, -1.0f);
glTranslatef(0.0f, , 0.0f);
glutSolidSphere(, , ); // glBegin(GL_LINE_STRIP);
// for (int i = 0; i < 361; i++)
// {
// glVertex3f(20 * (float)sin(i * PI / 180), 0, 20 * (float)cos(i * PI / 180));
// }
// glEnd();
}
{
GLfloat earth_mat_ambient[] = {1.0f, 0.5f, 0.31f, 1.0f}; //定义材质的环境光颜色,骗蓝色
GLfloat earth_mat_diffuse[] = {1.0f, 0.4f, 0.2f, 1.0f}; //定义材质的漫反射光颜色,偏蓝色
GLfloat earth_mat_specular[] = {1.0f, 0.0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,红色
GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0
GLfloat earth_mat_shininess = 30.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);
//绘制棕色的“土星环”
glColor3f(0.7f, 0.5f, 0.0f);
glRotatef((day+) / 360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(0.0f, 0.0f, 0.0f);
glRotatef(10.0, 0.0, 0.0, 1.0);
glutWireTorus(0.5, , , );
}
{
GLfloat earth_mat_ambient[] = {0.0f, 0.0f, 1.0f, 1.0f}; //定义材质的环境光颜色,骗蓝色
GLfloat earth_mat_diffuse[] = {0.0f, 0.0f, 0.5f, 1.0f}; //定义材质的漫反射光颜色,偏蓝色
GLfloat earth_mat_specular[] = {1.0f, 0.0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,红色
GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0
GLfloat earth_mat_shininess = 40.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);
//绘制蓝色的“地球”
glPopMatrix();//太阳的变换矩阵弹栈
glPushMatrix();
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(day / 360.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(, 0.0f, 0.0f);
glutWireSphere(, , );
}
{
GLfloat earth_mat_ambient[] = {0.156, 0.941, 0.47, 1.0f}; //定义材质的环境光颜色,骗蓝色
GLfloat earth_mat_diffuse[] = {0.156, 0.941, 0.47, 1.0f}; //定义材质的漫反射光颜色,偏蓝色
GLfloat earth_mat_specular[] = {1.0f, 0.0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,红色
GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0
GLfloat earth_mat_shininess = 30.0f;
glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);
glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);
glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);
//绘制黄色的“月亮”
glColor3f(0.156, 0.941, 0.47);
glRotatef(day / 30.0*360.0 - day / 360.0*360.0, 0.0f, 0.0f, -1.0f);
glRotatef(day / 30.0*360.0, 0.0f, 0.0f, -1.0f);
glTranslatef(, 0.0f, 0.0f);
glutSolidSphere(, , );
} GLfloat earth_mat_ambient[][] = {{0.9, 0.941, 0.47, 1.0f},{0.0f, 0.941, 0.235, 1.0f},{1.0f, 0.6f, 1.0f, 1.0f}}; //定义材质的环境光颜色,骗蓝色
GLfloat earth_mat_diffuse[][] = {{0.57, 0.941, 0.47, 1.0f},{0.0f, 0.941, 0.235, 1.0f},{1.0f, 0.6f, 1.0, 1.0f}}; //定义材质的漫反射光颜色,偏蓝色
GLfloat earth_mat_specular[][] = {{1.0f, 0.0f, 0.0f, 1.0f},{1.0f, 0.0f, 0.0f, 1.0f},{1.0f, 0.0f, 0.0f, 1.0f}}; //定义材质的镜面反射光颜色,红色
GLfloat earth_mat_emission[][] = {{0.0f, 0.0f, 0.0f, 1.0f},{0.0f, 0.0f, 0.0f, 1.0f},{0.0f, 0.0f, 0.0f, 1.0f}}; //定义材质的辐射光颜色,为0
GLfloat earth_mat_shininess[] = {30.0f,20.0f,10.0f};
GLfloat glColor[][] = {{0.47, 0.941, 0.47},{0.0f, 0.941, 0.235},{1.0f, 0.6f, 1.0f}};
GLfloat glTranslate[][] = {{, -, 0.0f},{-, , 0.0f},{, , 0.0f}};
GLfloat radius[][] ={{, , },{, , },{, , }};
GLfloat speed[] = {(day-) / 360.0*360.0,(day-) / 360.0*360.0,(day-) / 360.0*360.0};
for(int i=;i<;i++)
{
glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient[i]);
glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse[i]);
glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular[i]);
glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission[i]);
glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess[i]);
//绘制蓝色的“地球”
glPopMatrix();//太阳的变换矩阵弹栈
glPushMatrix();
glColor3f(glColor[i][],glColor[i][],glColor[i][]);
glRotatef(speed[i], 0.0f, 0.0f, -1.0f);
glTranslatef(glTranslate[i][],glTranslate[i][],glTranslate[i][]);
glutSolidSphere(radius[i][],radius[i][],radius[i][]);
}
//画行星轨道
if(hasOrbit==1.0f)
{
glPopMatrix();
glutWireTorus(0.1, , , );
glutWireTorus(0.1, 353.55, , );
glutWireTorus(0.1, 332.42, , );
glutWireTorus(0.1, 424.26, , );
glutWireTorus(0.1, , , );
}
//画坐标轴
if(hasCoordinate==1.0f)
{
const int AXES_LEN = ;
const int ARROW_LEN = ;
const int ARROW_RADIUS = ; GLUquadricObj *objCylinder = gluNewQuadric();
//确定坐标系原点
glPushMatrix();
glColor3f(1.0f, 1.0f, 1.0f);
glutSolidSphere(, , );
glPopMatrix(); glPushMatrix();
glColor3f(1.0f, 0.0f, 0.0f);
glutSolidSphere(0.25, , );
gluCylinder(objCylinder, , , AXES_LEN, , ); //z
glTranslatef(, , AXES_LEN);
gluCylinder(objCylinder, ARROW_RADIUS, , ARROW_LEN, , ); //z arrow
glPopMatrix(); glPushMatrix();
glColor3f(0.0f, 1.0f, 0.0f);
glRotatef(, 1.0, 0.0, 0.0);
gluCylinder(objCylinder, , , AXES_LEN, , ); //Y
glTranslatef(, , AXES_LEN);
gluCylinder(objCylinder, ARROW_RADIUS, , ARROW_LEN, , ); //Y arrow
glPopMatrix(); glPushMatrix();
glColor3f(0.0f, 0.0f, 1.0f);
glRotatef(, 0.0, 1.0, 0.0);
gluCylinder(objCylinder, , , AXES_LEN, , ); //X
glTranslatef(, , AXES_LEN);
gluCylinder(objCylinder, ARROW_RADIUS, , ARROW_LEN, , ); //X arrow
glPopMatrix();
}
glFlush();
glutSwapBuffers();
}
void myIdle(void)
{
Sleep();
++day;
if (day >= )
day = ;
myDisplay();
} void mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON&&state == GLUT_DOWN)
{
roate = ;
rote = ;
oldx = x;//当左键按下时记录鼠标坐标
oldy = y;
}
if (button == GLUT_MIDDLE_BUTTON&&state == GLUT_DOWN)
{
isy = 0.0;
isz = 1.0;
oldx = x;//当左键按下时记录鼠标坐标
oldy = y;
roate += 2.0f;
}
if (button == GLUT_RIGHT_BUTTON&&state == GLUT_DOWN)
{
isy = 1.0;
isz = 0.0;
oldx = x;//当左键按下时记录鼠标坐标
oldy = y;
roate += 2.0f;
}
} void motion(int x, int y)
{
GLint deltax = oldx - x;
GLint deltay = oldy - y;
anglex += * (GLfloat)deltay / (GLfloat)WinW;//根据屏幕上鼠标滑动的距离来设置旋转的角度
angley += * (GLfloat)deltax / (GLfloat)WinH;
// anglez += 360 * (GLfloat)deltay / (GLfloat)WinH;
oldx = x;//记录此时的鼠标坐标,更新鼠标坐标
oldy = y;//若是没有这两句语句,滑动是旋转会变得不可控
glutPostRedisplay();
glutPostRedisplay();
} void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case 'o':
case'O':
hasOrbit = 0.0f;
break;
case 'p':
case 'P':
hasOrbit = 1.0f;
break;
case 'y':
case'Y':
hasCoordinate = 1.0f;
break;
case 'n':
case 'N':
hasCoordinate = 0.0f;
break;
case 'c':
case'C':
hasCharacter = 1.0f;
break;
case 'v':
case 'V':
hasCharacter = 0.0f;
break;
case 'i':
case 'I':
eyehight-=;
break;
case 'u':
case 'U':
eyehight+=;
break;
case 'w':
case 'W':
eyey+=;
break;
case 's':
case 'S':
eyey-=;
break;
case 'a':
case 'A':
eyex-=;
break;
case 'd':
case 'D':
eyex+=;
break;
}
} //选择字体函数
void selectFont(int size, int charset, const char*face)
{
HFONT hFont = CreateFontA(size, , , , FW_MEDIUM, , , ,
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();
//计算字符的个数
//如果是双字节字符的(比如中文字符),两个字节才算一个字符
//否则一个字节算一个字符
len = ;
for (i = ; str[i] != '\0'; ++i)
{
if (IsDBCSLeadByte(str[i]))
++i;
++len;
}
//将混合字符转化为宽字符
wstring = (wchar_t*)malloc((len + ) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -, wstring, len);
wstring[len] = L'\0';
//逐个输出字符
for (i = ; i < len; ++i)
{
wglUseFontBitmapsW(hDC, wstring[i], , list);
glCallList(list);
}
//回收所有临时资源
free(wstring);
glDeleteLists(list, );
} int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(, );
glutInitWindowSize(, );
glutCreateWindow("I love OpenGL");
glutDisplayFunc(&myDisplay);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc(keyboard);
glutIdleFunc(&myIdle);
glutMainLoop();
return ;
}

  

3D_solarSys的更多相关文章

随机推荐

  1. shell查找七天之前的文件

    #!/bin/bashaweekago=`date -d "7 days ago" +%s`for f in $(ls) do stat -c %Y ${f} aa=`stat - ...

  2. Centos6.10-FastDFS-Tracker-Nginx示例配置

    nginx 安装过程<详见> 1.进入工作目录 cd /usr/local/nginx/conf 2.创建子目录 mkdir configs 3.创建storage代理配置 cd conf ...

  3. 6_8 树(UVa548)<从中序和后序恢复二叉树>

    你的任务是找出一棵二叉树中最小路径上终端节点(树叶,leaf node)的值.所谓路径乃指从根节点(root)旅行到任一终端节点.路径的值为所经过的节点的值的和(包含根节点及终端节点).而最小路径就是 ...

  4. 新手学习arm的建议

    本文来自:chen4013874的博客 如果您是ARM初学者或者以前是51单片机应用开发工程师,想快速进入32位ARM嵌入式开发领域,建议您阅读本文档.本文档是我们结合多年ARM开发经验,针对初学者对 ...

  5. HDU 1237 简单计算器(栈+stringstream)

    提供几份代码,这题的输入可以用stringsteam处理,先处理乘除后处理加减,正常思路,但是后面统计加减法的时候,对栈的运用错了,我用的时候相当于给它多加了几个括号就错了. 正确的简单解法就是,加法 ...

  6. 在虚拟机安装centos7

    因为工作需要,要经常用到虚拟机,以I前老让别人给装,可是老问人家也不好,自己整理一份比较适合小白用的教程,有点繁琐: 一.工具:VMware      CentOS7 的 ISO 文件 二.开始安装 ...

  7. plutosdr初步

    关于最近新出的pluto sdr ,一款较新的sdr,可以通过破解将ad9363改成ad9361,提升频率范围,但是据说没有办法改变带宽. 可以通过补丁方式使用某款软件来进行收听fm

  8. ASP.NET CORE 基础知识(一):概述【上】

    此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 原文请参考MSDN ASP.NET Core. 这篇文章是 ...

  9. MYSQL数据库索引、事务。

    =============================================================================================== inno ...

  10. 使用UUID防止文件重名

    在原文件名的基础上加 UUID.randomUUID().toString()