OpenGL实现太阳系绘制

太阳系实现

  • 环境准备
  • 一、部分知识结构
  • 二、使用步骤
    • 1.引入库
    • 2.初始化光照、纹理、粒子
    • 3、绘制星体、轨迹
  • 总结
  • 参考

环境准备

windows10+VS2017+OpenGL

一、部分知识结构

glEnable(GL_TEXTURE_2D); // 激活TEXTURE0单元
MultiByteToWideChar:Windows提供的转换函数;该函数映射一个字符串到一个宽字符(unicode)的字符串
gluBuild2DMipmaps()可以自动生成不同细节层次的图片,即不同精细程度的图片。
glTexCoord2f() 函数
原型:glTexCoord2f(GLfloat s,GLfloat t);
s代表x坐标,t代表y坐标;
s∈[0.0,1.0],t∈[0.0,1.0];
用法:glTexCoord2f(0.0f, 0.0f);glVertex3f(-width /100, -height/100, 10–外部);
OpenGL实现太阳系绘制_第1张图片
text纹理:逆时针;左下开始(0,0)
glCallList:显示列表是收集好所有的顶点,一次性的发送给GPU

void WINAPI glMap1f(
GLenum target,
GLfloat u1,
GLfloat u2,
GLint stride,
GLint order,
const GLfloat points
);
每个控制点均为三个表示 x、y 和 z 的浮点值。 计算映射时,将生成内部 glVertex3 命令。
0.0:该变量由该命令指定的公式进行计算。
1.0:U 的线性映射,如 glEvalCoord1所示,到 u^,该变量由该命令指定的公式进行计算。
在 点 中引用的数据结构中,一个控制点的开头和下一个控制点开头之间的浮点数或双精度数。
–这样,就可以将控制点嵌入到任意数据结构中。 唯一的约束是,
–特定控制点的值必须占用连续的内存位置。
控制点的数目。 必须为正数。
指向控制点数组的指针。
/

glEvalCoord1f((GLfloat)i / Line_Count);//根据4个控制点坐标的参数化插值

二、使用步骤

1.引入库

代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include "LoadBMP.h"
#include "particle.h"
#include 	

2.初始化光照、纹理、粒子

代码如下:

//设置材质、光照效果
	GLfloat mat_specular []={1,1,1,1.0};          
	GLfloat mat_shininess []={500.0};             
	GLfloat light_position[] = {7, 7, 0, 0};	  
	GLfloat white_light[] = {1, 1, 1, 1};	      
	GLfloat lmodel_ambient[]  = {0.8, 0.8,0.8,1};
	GLfloat mat_emission []={0.1,0.1,0.1,1.0};    

	glClearColor (0.0, 0.0, 0.0, 0.0);

	glShadeModel(GL_SMOOTH);
	glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
	glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
	glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
	glLightfv(GL_LIGHT0,GL_POSITION,light_position);
	glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);             
	glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);            
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);   

	glEnable(GL_LIGHTING);                                   
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);


	GLfloat LightAmbient[]  = {0.8, 0.8,0.8,1};
	GLfloat LightDiffuse[] = {1, 0.8, 0.8, 1};
	GLfloat LightPosition[] = {0,0,2, 0};	
	glEnable(GL_LIGHTING);                               
	glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);      
	glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);      
	glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);    

	glEnable(GL_TEXTURE_2D);	
	//初始化粒子及纹理效果
	initParticle();
	LoadAllTextures();		

3、绘制星体、轨迹

以下部分代码为土星绘制其他类似:

	glPushMatrix();
	drawCircle(8.0);
	glBindTexture(GL_TEXTURE_2D, saturn->texID);
	glRotatef((GLfloat)month / 1.7, 0.0, 1.0, 0.0);
	glTranslatef(8.0, 0.0, 0.0);
	glRotatef(30, -1, 0, 0);

	glPushMatrix();
	glRotatef((GLfloat)month, 0.0, 1.0, 0.0);
	glRotatef(90, -1, 0, 0);
	gltDrawSphere(0.35, 10, 10);
	glPopMatrix();


	glPushMatrix();

	glRotatef((GLfloat)month / 3, 1.0, 0.0, 0.0);
	gluDisk(quadric, 0.4, 0.5 ,20, 10); 
	glBindTexture(GL_TEXTURE_2D, jupiter->texID);
	gluDisk(quadric, 0.55, 0.7, 20, 10);
	glPopMatrix();
	glPopMatrix();

总结

以下实现恒星、行星、卫星公转自转,天空盒,粒子,鼠标、键盘处理效果
OpenGL实现太阳系绘制_第2张图片

链接:https://pan.baidu.com/s/1F607nfxq5_XxSPz_su71dg
提取码:mkio

参考

LearnOpenGL
简单实现太阳系模拟

你可能感兴趣的:(OpenGL,opengl)