3D球体一个(纪念第一个opengl程序~~)
2016-07-24 10:11
447 查看
终于搞定第一个像样的简单opengl程序,不过纹理贴图部分目前还是一头雾水啊,明天一定将其搞定。
先上个实例图:
功能很简单,使用鼠标的左中右键分别设置球体颜色的 RGB参数以调整颜色。
按a或d使球体旋转
代码如下
[cpp] view
plain copy
// display.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <gl/GL.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <cstdlib>
const GLfloat lightPosition[] = {10.0,10.0,10.0,0.0};
const GLfloat whiteLight[] = {0.8,0.8,0.8,1.0};
GLfloat matSpecular [] = {0.3,0.3,0.3,1.0};
GLfloat matShininess [] = {20.0};
GLfloat matEmission [] = {0.3,0.3,0.3,1.0};
GLfloat spin = 0;
void init()
{
glClearColor(0.3,0.3,0.3,1.0);
glClearDepth(1.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);
glLightfv(GL_LIGHT0,GL_DIFFUSE,whiteLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,whiteLight);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();;
glOrtho(-10.0,10.0,-10.0,10.0,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glRotatef(spin,0.0,1.0,0.0);
glMaterialfv(GL_FRONT,GL_SPECULAR,matSpecular);
glMaterialfv(GL_FRONT,GL_SHININESS,matShininess);
glMaterialfv(GL_FRONT,GL_EMISSION,matEmission);
glutSolidSphere(3.0,16,16);
glPopMatrix();
glFlush();
}
void reshape(int w,int h)
{
glViewport(0.0,0.0,(GLsizei) w,(GLsizei) h);
}
void keyboardFunc(unsigned char key,int x,int y)
{
switch(key)
{
case 'a':
spin +=30;
break;
case 'd':
spin -=30;
break;
}
if(spin<360)
spin +=360;
else if(spin>=360)
spin -=360;
glutPostRedisplay();
}
void mouseFunc(int button,int state,int x,int y)
{
if(state==GLUT_DOWN){
switch (button)
{
case GLUT_LEFT_BUTTON:
matEmission[0]+=1.0;
if(matEmission[0]>1.0)
matEmission[0]-=1.1;
break;
case GLUT_MIDDLE_BUTTON:
matEmission[1]+=1.0;
if(matEmission[1]>1.0)
matEmission[1]-=1.1;
break;
case GLUT_RIGHT_BUTTON:
matEmission[2]+=1.0;
if(matEmission[2]>1.0)
matEmission[2]-=1.1;
break;
}
glutPostRedisplay();
}
}
int main(int argc,char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH);
glutInitWindowSize(450,450);
glutInitWindowPosition(150,150);
glutCreateWindow("rotate sphere");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboardFunc);
glutMouseFunc(mouseFunc);
init();
glutMainLoop();
return EXIT_SUCCESS;
}
先上个实例图:
功能很简单,使用鼠标的左中右键分别设置球体颜色的 RGB参数以调整颜色。
按a或d使球体旋转
代码如下
[cpp] view
plain copy
// display.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <gl/GL.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <cstdlib>
const GLfloat lightPosition[] = {10.0,10.0,10.0,0.0};
const GLfloat whiteLight[] = {0.8,0.8,0.8,1.0};
GLfloat matSpecular [] = {0.3,0.3,0.3,1.0};
GLfloat matShininess [] = {20.0};
GLfloat matEmission [] = {0.3,0.3,0.3,1.0};
GLfloat spin = 0;
void init()
{
glClearColor(0.3,0.3,0.3,1.0);
glClearDepth(1.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);
glLightfv(GL_LIGHT0,GL_DIFFUSE,whiteLight);
glLightfv(GL_LIGHT0,GL_SPECULAR,whiteLight);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();;
glOrtho(-10.0,10.0,-10.0,10.0,-10.0,10.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glRotatef(spin,0.0,1.0,0.0);
glMaterialfv(GL_FRONT,GL_SPECULAR,matSpecular);
glMaterialfv(GL_FRONT,GL_SHININESS,matShininess);
glMaterialfv(GL_FRONT,GL_EMISSION,matEmission);
glutSolidSphere(3.0,16,16);
glPopMatrix();
glFlush();
}
void reshape(int w,int h)
{
glViewport(0.0,0.0,(GLsizei) w,(GLsizei) h);
}
void keyboardFunc(unsigned char key,int x,int y)
{
switch(key)
{
case 'a':
spin +=30;
break;
case 'd':
spin -=30;
break;
}
if(spin<360)
spin +=360;
else if(spin>=360)
spin -=360;
glutPostRedisplay();
}
void mouseFunc(int button,int state,int x,int y)
{
if(state==GLUT_DOWN){
switch (button)
{
case GLUT_LEFT_BUTTON:
matEmission[0]+=1.0;
if(matEmission[0]>1.0)
matEmission[0]-=1.1;
break;
case GLUT_MIDDLE_BUTTON:
matEmission[1]+=1.0;
if(matEmission[1]>1.0)
matEmission[1]-=1.1;
break;
case GLUT_RIGHT_BUTTON:
matEmission[2]+=1.0;
if(matEmission[2]>1.0)
matEmission[2]-=1.1;
break;
}
glutPostRedisplay();
}
}
int main(int argc,char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH);
glutInitWindowSize(450,450);
glutInitWindowPosition(150,150);
glutCreateWindow("rotate sphere");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboardFunc);
glutMouseFunc(mouseFunc);
init();
glutMainLoop();
return EXIT_SUCCESS;
}
相关文章推荐
- Opengl绘制点
- 怎么才能使服务器Nginx(或者Apache)支持字体文件
- 关于Linux 下的错误路由产生火星包的问题
- linux笔记:文件系统管理-fdisk分区
- centos---error: command 'gcc' failed with exit status 1
- 0成本+0基础玩转跨境电商开店创业项目,月入数万元
- 解决linux系统WIFI无法使用5GHz频率的问题
- 每天一篇linux教程-----Linux 文件基本属性
- JavaScript提高网站性能优化的建议(二)
- linux分区知识
- Nginx介绍与安装
- 学习笔记:进步一认识mesos(部分翻译)
- Linux中TFTP使用详解
- Scrapy入门
- 一天一条Linux指令-dd
- mac shell 基本操作
- 【嵌入式学习日记】2016年7月24日
- Linux makefile 教程 非常详细,且易懂
- ERROR org.apache.struts2.dispatcher.DefaultDispatcherErrorHandler - Exception
- linux下使用过程中的一些列解决方法