OpenGL三维与光照
#include<windows.h>
#include<gl/glut.h>
#include<gl/gl.h>
#include<gl/glu.h> //参数指定正方形的位置和大小
GLfloat x1=100.0f;
GLfloat y1=150.0f;
GLsizei rsize=; //正方形运动变化的步长
GLfloat xstep=1.0f;
GLfloat ystep=1.0f; //窗口的大小
GLfloat windowWidth;
GLfloat windowHeight; //画的物体
void DrawDUA();
void DrawTR(); //属性开关
void SunShine(void);//光照 //三维
GLfloat rtri;
GLfloat rquad; //开关
BOOL Draw3D=true;//三维动画演示开关
BOOL Draw2D=false;//二维动画演示开关
BOOL DrawAtoms=false;//原子动画演示开关 //三维属性开关
BOOL AS=true;//透视投影开关
BOOL OR=false;//正交平行投影
BOOL LIGHT=true;//光照开关 void RenderScene(void)
{
if(Draw3D)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if(LIGHT)
SunShine(); glTranslatef(-1.5f,0.0f,-6.0f);
glRotatef(rtri,0.0f,1.0f,0.0f); DrawTR(); glLoadIdentity();
glTranslatef(1.5f,0.0f,-6.0f);
glRotatef(rquad,1.0f,0.0f,0.0f);
glColor3f(0.5f,0.5f,1.0f); DrawDUA(); rtri+=1.0f;
rquad-=0.5f;
} if(Draw2D)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glRectf(x1,y1,x1+rsize,y1+rsize);
} if(DrawAtoms)
{
//绕核旋转角度
static float fElect1=0.0f; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //重置模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
if(LIGHT)
SunShine(); //将图形沿Z轴负向移动
glTranslatef(0.0f,0.0f,-250.0f); //绘制红色原子核
glColor3f(1.0f,0.0f,0.0f);
glutWireSphere(10.0f,,); //绘制颜色变成绿色
glColor3f(0.0f,1.0f,0.0f); //绘制第一个电子
//保存当前的模型视图矩阵
glPushMatrix();
glRotatef(fElect1,0.0f,1.0f,0.0f);//绕y轴旋转一定角度
glTranslatef(90.0f,0.0f,0.0f);//平移一段距离
glutSolidSphere(6.0f,,);//画出电子 //恢复矩阵
glPopMatrix();
glColor3f(0.0f,0.0f,1.0f);//绘制颜色变成蓝色
//第二个电子
glPushMatrix();
glRotatef(45.0f,0.0f,0.0f,1.0f);
glRotatef(fElect1,0.0f,1.0f,0.0f);
glTranslatef(-70.0f,0.0f,0.0f);
glutSolidSphere(6.0f,,);
glPopMatrix(); glColor3f(1.0f,1.0f,0.0f);//绘制颜色变成黄色
//第三个电子
glPushMatrix();
glRotatef(-45.0f,0.0f,0.0f,1.0f);
glRotatef(fElect1,0.0f,1.0f,0.0f);
glTranslatef(0.0f,0.0f,60.0f);
glutSolidSphere(6.0f,,);
glPopMatrix();
fElect1+=10.0f;
if(fElect1>360.0f)
fElect1=10.0f;
}
glutSwapBuffers();
} void ChangeSize(GLsizei w,GLsizei h)
{
if(h==)
h==; //设置视区尺寸
glViewport(,,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); if(Draw3D||DrawAtoms)
{
//修剪空间(透视投影)
if(AS)
{
GLfloat fAspect;
fAspect =(float)w/(float)h;
gluPerspective(45.0,fAspect,1.0,500.0);
} //(正交平行投影)
if(OR)
{
if(w<=h)
glOrtho(-2.25,2.25,-2.25*h/w,2.25*h/w,-10.0,10.0);
else
glOrtho(-2.25*h/w,2.25*h/w,-2.25,2.25,-10.0,10.0);
} } if(Draw2D)
{
if(w<=h)
{
windowHeight=250.0f*h/w;
windowWidth=250.0f;
}
else
{
windowWidth=250.0f*w/h;
windowHeight=250.0f;
} glOrtho(0.0f,windowWidth,0.0f,windowHeight,1.0f,-1.0f);
} glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} void TimerFunction(int value)
{
if(x1>windowWidth-rsize||x1<)
xstep=-xstep;
if(y1>windowHeight-rsize||y1<)
ystep=-ystep; x1+=xstep;
y1+=ystep; glutPostRedisplay();
glutTimerFunc(,TimerFunction,);
} void SetupRC(void)
{
if(Draw3D||DrawAtoms)
{
glEnable(GL_DEPTH_TEST);//启用深度测试
glFrontFace(GL_CCW);
}
glClearColor(0.0f,0.0f,1.0f,1.0f);
}
void TimerFunc(int value)
{
glutPostRedisplay();
if(Draw3D)
{
glutTimerFunc(,TimerFunc,);
}
if(DrawAtoms)
{
glutTimerFunc(,TimerFunc,);
} }
int main(int argc,char* argv[])
{
if(Draw2D)
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutCreateWindow("Bounce");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutTimerFunc(,TimerFunction,);
}
if(Draw3D||DrawAtoms)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutCreateWindow("原子示例");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScene);
if(DrawAtoms)
glutTimerFunc(,TimerFunc,);
else
glutTimerFunc(,TimerFunc,);
} SetupRC();
glutMainLoop();
}
void DrawTR()
{
glBegin(GL_TRIANGLES);
//
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f); glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,1.0f); glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f); //
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f); glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f); glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f); //
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f); glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f); glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f); //
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f); glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f); glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,1.0f); glEnd();
} void DrawDUA()
{
glBegin(GL_QUADS); glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(1.0f,1.0f,1.0f); glColor3f(1.0f,0.5f,0.0f);
glVertex3f(1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f,-1.0f); glColor3f(1.0f,0.0f,0.0f);
glVertex3f(1.0f,1.0f,1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glVertex3f(1.0f,-1.0f,1.0f); glColor3f(1.0f,1.0f,0.0f);
glVertex3f(1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(1.0f,1.0f,-1.0f); glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,1.0f,1.0f);
glVertex3f(-1.0f,1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,1.0f);
glEnd();
} void SunShine(void)
{ GLfloat sun_light_position[]={0.0f,0.0f,0.0f,1.0f};
GLfloat sun_light_ambient[]={0.0f,0.0f,0.0f,1.0f};
GLfloat sun_light_diffuse[]={1.0f,1.0f,1.0f,1.0f};
GLfloat sun_light_specular[]={1.0f,1.0f,1.0f,1.0f}; 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);
}
OpenGL三维与光照的更多相关文章
- OpenGL中的光照技术(翻译)
Lighting:https://www.evl.uic.edu/julian/cs488/2005-11-03/index.html 光照 OpenGL中的光照(Linghting)是很重要的,为什 ...
- Qt OpenGL三维绘图
简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...
- Linux OpenGL 实践篇-6 光照
经典光照模型 经典光照模型通过单独计算光源成分得到综合光照效果,然后添加到物体表面特定点,这些成分包括:环境光.漫反射光.镜面光. 环境光:是指不是来特定方向的光,在经典光照模型中基本是个常量. 漫反 ...
- 基于OpenGL三维软件开发
实验原理: OpenGL在MFC下编程原理---- Windows操作系统对OpenGL的支持 在Windows下用GDI作图必须通过设备上下文(DeviceContext简写DC)调用相应的函数:用 ...
- OpenGL三维镂垫
2015-12-12帮舍友尝试这个代码的时候发现舍友的会出现No GLSL support 后来发现舍友的版本2.0.2.1才能用 舍友的是glutInitContextVersion(3, 1);改 ...
- [图形学] Chp10 OpenGL三维观察程序示例
10.10节书中给出了一个程序示例,有一个填充正方形,从侧面的角度观察并画到屏幕上. 图0 这里进一步画出一个立方体,将相机放入立方体中心,旋转相机,达到在立方体中旋转看到不同画面的效果. 步骤: 1 ...
- OpenGL ES2.0光照
一.简单光照原理 平行光(正常光) 光照效果= 环境颜色 + 漫反射颜色 + 镜面反射颜色 点光源 光照效果= 环境颜色 + (漫反射颜色 + 镜面反射颜色)× 衰减因子 聚光灯 光照效果= ...
- OpenGL——三维多面体实现
#include<iostream> #include <math.h> #include<Windows.h> #include <GL/glut.h> ...
- 三维投影总结:数学原理、投影几何、OpenGL教程、我的方法
如果要得到pose视图,除非有精密的测量方法,否则进行大量的样本采集时很耗时耗力的.可以采取一些取巧的方法,正如A Survey on Partial of 3d shapes,描述的,可以利用已得到 ...
随机推荐
- d3 js emberjs handlerbarjs
http://handlebarsjs.com/ http://emberjs.com/ http://jsbin.com/d3ember-barchart/13/edit?html,output
- JavaWeb基础—JSP
一.什么是JSP JSP 全称是 Java Server Pages,是一种开发动态web资源的技术 在原HTML上添加JAVA脚本(灵魂工程师,为页面添加灵魂),可以说 jsp = html + j ...
- WPF 播放Flash
原文:WPF 播放Flash WPF中没有直接提供播放Flash的控件. 可以使用WebBrowser来打开,代码如下: <Window x:Class="Nankang.Itacat ...
- 【转载】基于MFC的ActiveX控件开发(3)
原文:http://iysm.net/?p=122 3.事件 ActiveX 控件使用事件通知容器控件上发生了某些事情.事件的常见示例包括单击控件.使用键盘输入数据和控件状态更改.当发生这些操作时,控 ...
- idea maven javaweb项目迁移时的maven和版本报错问题解决(可解决同类错误)
项目中代码红线报版本不支持xx语法,只需要将java版本设置为当前机器使用的java版本即可 这里我使用的是idea自带的maven,如果是自己安装的maven需要在 home directory 处 ...
- docker部署jenkins环境
首先获取jenkins的镜像: docker pull jenkins 设置jenkins_home映射: sudo mkidr -p /jenkins_home /jenkins_home 启动容器 ...
- 用vs2012编译cocos2dx-3.9
这几天想玩一下cocos2dx3.9新版本的东西,但是公司电脑配置不够,开个vs2012都卡的不行,更别提高版本的了.因为cocos2dx-3.9中使用了好多c++11的规范,而vs2012有好多C+ ...
- Docker部署Redis容器
从仓库下载镜像 sudo docker pull redis 创建容器(前提:将redis.conf文件放入到/Users/chengang/docker/redis目录里面) docker ru ...
- parewise算法性能优化
在<接口自动化测试框架-AIM>这篇博客中,提到了parewise算法. 这次对其进行性能优化,共3点. 一. 因为笛卡尔积和两两拆分,是有序的. 就保证了两两拆分后的每列都是相同位置的元 ...
- Intellij IDEA创建maven项目无java文件问题
在idea开发工具中创建工程时,点击右键没有创建包.接口.java类的提示, 如图: 解决之前的项目目录为: 针对这种情况,对idea开发工具做以下设置. 选择File->Project Str ...