• 大小: 2.29MB
    文件类型: .zip
    金币: 1
    下载: 1 次
    发布日期: 2021-04-07
  • 语言: 其他
  • 标签: Opengl  C++  

资源简介

在太阳系程序的基础上添加光照效果 - 宇宙中加一盏泛光 - 太阳自发光 - 太阳系中加一艘飞碟,飞碟沿着椭圆轨道绕地球或太阳运行,其上有一个spot light始终照耀着地球 程序为博主个人独自编写,切勿用于商用

资源截图

代码片段和文件信息

#include
#include 
#include 
#include 

/*变量设置*/
const GLfloat windowWidth = 700.0f;//初始窗口宽
const GLfloat windowHeight = 500.0f;//初始窗口高
const GLfloat pi = 3.1415926;
GLfloat  distance = -3.6f;
GLfloat sunTheta = 0.0f;//太阳旋转角度
GLfloat earthTheta = 0.0f;//地球旋转角度
GLfloat monthTheta = 0.0f;//月球旋转角度
GLfloat dSunToEarth = 2.5f;//太阳到地球
GLfloat dEarthToMonth = 0.35f;//地球到月亮
GLfloat sunR = 0.6f;//太阳半径
GLfloat earthR = 0.15f;//地球半径
GLfloat monthR = 0.08f;//月亮半径
GLsizei n = 7200;//线段绘制次数
GLfloat sunEarthFai = 10.0f;//控制日地轨道倾斜
GLfloat earthMonthFai = -20.0f;//控制地月轨道倾斜
GLfloat a = 1.0f;//椭圆长半轴
GLfloat b = 0.35f;//椭圆短半轴
GLfloat t = 0.0f;//卫星旋转角度
GLfloat sateX = a * cos(t * pi);
GLfloat sateZ = b * sin(t * pi);
GLfloat sateR = 0.05f;//卫星半径

//视点位置
GLfloat x = 0;
GLfloat y = 0.3;
GLfloat z = 2.0;

//方向光照参数
GLfloat vLit0Position[4] = { 0100.0f };//位置
GLfloat vLit0Ambient[4] = { 0.2f0.2f0.2f1.0f };//环境光
GLfloat vLit0Diffuse[4] = { 0.8f0.8f0.8f1.0f };//漫射光
GLfloat vLit0Specluar[4] = { 0.5f0.5f0.5f1.0f };//强光

//聚光灯光照参数
GLfloat vSpotPosition[4] = { sateX 0.0fsateZ1.0f };//位置——始终为卫星的位置
GLfloat vSpotDirection[3] = {-sateX 0.0f -sateZ };//方向——始终从卫星射向地球
GLfloat spotExp = 1.0f;//衰减系数
GLfloat spotCutoff = 15.0f;//聚光灯的光锥的发散角度

GLfloat vEmission[4] = { 0.80.50.01.0 }; //材质的发射光颜色
GLfloat vEmission2[4] = { 0.00.00.11.0 }; //材质的发射光颜色2
/*用户函数*/
void myInit();//初始化函数

/*回调函数*/
void display(void);//绘制函数
void myReshape(GLsizei wGLsizei h);
void myTimeFunc(int value);//定时器回调函数
void processNormalKeys(unsigned char key int x int y);//响应键盘输入,从而设定物体移近移远以及旋转的回调函数


int main(int argcchar * argv[])
{
glutInit(&argc argv);
/*1-设置显示模式*/
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

/*2-初始化窗口*/
glutInitWindowSize(windowWidthwindowHeight);
glutInitWindowPosition(100100);

/*3-创建窗口*/
glutCreateWindow(“LightSunEarthMonth“);

/*4-设置一系列回调函数*/
myInit();
glutKeyboardFunc(processNormalKeys);//键盘响应
glutTimerFunc(10myTimeFunc0);//使物体运动
glutReshapeFunc(myReshape);//窗口变化响应
glutDisplayFunc(display);
glutIdleFunc(display);

/*5-启动主循环*/
glutMainLoop();
return 0;
}
void display()
{
//设置清除屏幕的颜色,并清除屏幕和深度缓冲
glClearColor(0.0f 0.0f 0.0f 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

gluLookAt(x y z 0 0 0 0 1.0 0);//改变视点,便于观察
//设置成模型矩阵模式
glMatrixMode(GL_MODELVIEW);

/***************绘图*******************/
//载入单位化矩阵
glLoadIdentity();
glTranslatef(0 0 distance);//后推distance距离,方便显示

/*太阳*/
glRotatef(sunEarthFai 0 0 1);//日地轨道倾斜
/*日地轨道线——轨道线要先画,如果在太阳自转之后画,则会让轨道线也发生旋转,光照打在旋转的轨道线上,会发生变色,另外可使用Disable关闭光照对其的效果*/
glDisable(GL_LIGHTING);//轨道线不受光照影响
glBegin(GL_LINE_LOOP);
glColor4f(0.0f 1.0f 1.0f 0.0f);
for (int i = 0; i < n; i++)
{
glVertex3f(dSunToEarth * cos(2 * pi * i / n) 0.0f dSunToEarth * sin(2 * pi * i / n));//定义顶点
}
glEnd();
glFlush();
glEnable(GL_LIGHTING);//开启

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2020-05-12 19:44  作业5-光照太阳系\
     文件     2056581  2020-03-24 16:21  作业5-光照太阳系\LightSunEarthMonth.gif
     文件          81  2020-03-24 16:32  作业5-光照太阳系\README.md
     文件      491659  2020-03-24 16:34  作业5-光照太阳系\作业5-光照太阳系.pdf
     目录           0  2020-03-24 16:31  作业5-光照太阳系\作业5-程序\
     文件        7018  2020-03-24 16:14  作业5-光照太阳系\作业5-程序\main.cpp
     文件       68608  2020-03-24 16:14  作业5-光照太阳系\作业5-程序\MyTask05-LightSunEarthMonth.exe
     文件        1473  2020-03-23 15:47  作业5-光照太阳系\作业5-程序\MyTask05-LightSunEarthMonth.sln
     文件        6676  2020-03-23 16:02  作业5-光照太阳系\作业5-程序\MyTask05-LightSunEarthMonth.vcxproj
     文件         949  2020-03-23 16:02  作业5-光照太阳系\作业5-程序\MyTask05-LightSunEarthMonth.vcxproj.filters
     文件         168  2020-03-23 15:47  作业5-光照太阳系\作业5-程序\MyTask05-LightSunEarthMonth.vcxproj.user

评论

共有 条评论