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,描述的,可以利用已得到 ...
随机推荐
- MYSQL注入天书之盲注讲解
Background-2 盲注的讲解 何为盲注?盲注就是在sql注入过程中,sql语句执行的选择后,选择的数据不能回显到前端页面.此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注.从ba ...
- java中package import区别
他们两个是互逆过程package freedom.bean;将你这个类放在了/freedom/bean/这个文件夹下面要使用的话import freedom.bean.*;导入这个类
- JavaWeb总结(八)
对象作用域 在Servlet里可以用一个名字绑定一个对象,并且在应用中传递和使用这个对象 作用域对象 属性操作方法 作用域范围说明 ServletContext(上下文) void setAttrib ...
- 【LG3721】[HNOI2017]单旋
[LG3721][HNOI2017]单旋 题面 洛谷 题解 20pts 直接模拟\(spaly\)的过程即可. 100pts 可以发现单旋最大.最小值到根,手玩是有显然规律的,发现只需要几次\(lin ...
- Oracle 表备份还原
方法1: create table mdmuser20120801 as select * from mdmuser 方法2: create table mdmuser20120801 as se ...
- JAVAWEB eclipse开启服务器时,filter出现找不到的问题时
这个时候重启eclipse再开启服务器即可.
- 微信小程序—day01
前言 听说谷歌准备回中国了,玩了一下谷歌刚入驻微信的小程序:“猜画小歌”,又一次见识到了ai的强大魅力.看来python之路,前途还是一片光明的. 因为18年初时的“跳一跳”,带火了微信小程序,一直想 ...
- Android studio Error occurred during initialization of VM 问题解决
最近开发导入其他Android项目遇见的问题,如下图: 解决办法: 将org.gradle.jvmargs=的值该为521(堆内存分配过高导致) 备忘,希望能帮助到大家
- halcon 手眼标定的坐标转换原理讲解
原文链接:https://blog.csdn.net/opencv_learner/article/details/82113323 一直以来,对于手眼标定所涉及到的坐标系及坐标系之间的转换关系都没能 ...
- 一个IT男的表白
致BCD6 CEC0 C3F4 转一轮肩胛骨 倒一杯铁观音 白驹过隙,倏忽两秋 远方有希望和梦想 有火车.微信美颜视频聊天和碧根果 有你的支持 如果身旁没有你 生活无趣失去动力 就像python失去类 ...