// OpenGLBook.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" //变量声明
static GLfloat spin =0.0;
GLfloat zoom=-10.0f;
GLfloat angel=20.0f;
BOOL light; // 光源的开/关
BOOL lp; // L键按下了么?
BOOL fp; // F键按下了么?
GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
GLfloat mat_shininess[] = {50.0};
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
GLfloat white_light[] = {1.0, 1.0, 1.0, 1.0};
GLfloat lmodel_ambient[] = {0.1, 0.1, 0.1, 1.0};
//函数声明
void init(void);
void display(void);
void spinDisplay(void);
void reshape(int w,int h);
void mouse(int button,int state,int x,int y);
void processNormalKeys(unsigned char key,int x,int y);
void processKeyUpDowm(int key,int x,int y); /************************************************************************/
/* 函数实现 */
/************************************************************************/ //初始化
void init(void){
glClearColor(0.0f,0.0f,0.0f,0.0f);
glShadeModel(GL_SMOOTH); glShadeModel(GL_SMOOTH);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
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);
///////////////////////
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.1f,0.1f, 0.1f, 0.9f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
} //图形绘画
void display(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
// 重置模型观察矩阵 glPushMatrix();
//glLoadIdentity(); //等同于glPushMatrix();和glPopMatrix();配对重绘
glTranslatef(0.0f,0.0f,zoom);
glRotatef(spin,0.0f,1.0f,0.0f);
glutSolidSphere(1.0, , );
glPopMatrix();
glutSwapBuffers(); //交换屏幕缓冲区与后台缓冲区
angel+=5.0f;
glutPostRedisplay(); //重绘
// glPushMatrix();
} void reshape(int w,int h){
if (h==) // Prevent A Divide By Zero By
{
h=; // Making Height Equal One
} glViewport(,,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)w/(GLfloat)h,0.1f,100.0f);//透视 //glOrtho(-50.0,50.0,-50.0,50.0,-1.0,100.0); //平行修剪空间(离观察者远时,不会缩小)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} //鼠标响应
void mouse(int button,int state,int x,int y)
{ switch(state){
case GLUT_DOWN:
if (button==GLUT_LEFT_BUTTON) //左键
{ break;
}
if (button==GLUT_RIGHT_BUTTON) //右键
{ break;
}
case GLUT_UP:
if (button==GLUT_WHEEL_UP)
{
zoom-=1.0f;
glutPostRedisplay();
break;
}
else if (button==GLUT_WHEEL_DOWN)
{
zoom+=1.0f;
glutPostRedisplay();
break;
}
default:
break;
} }
//按键响应
void processNormalKeys(unsigned char key,int x,int y)
{
switch(key){
case :
exit();
break;
case 'l':
if (!lp)
{
lp=TRUE; // lp 设为 TRUE
light=!light; // 切换光源的 TRUE/FALSE
}
else{
lp=FALSE;
light=!light;
}
if (!light) // 如果没有光源
{
glDisable(GL_LIGHTING); // 禁用光源
}
else // 否则
{
glEnable(GL_LIGHTING); // 启用光源
}
break;
case 'r':
spin+=2.0f;
if (spin>360.0f)
{
spin-=360.0f;
}
glutPostRedisplay();
break;
} } void processKeyUpDowm(int key,int x,int y){
switch(key){
case GLUT_KEY_UP:
lp=TRUE;
break;
case GLUT_KEY_DOWN:
lp=false;
break;
default:
break;
}
}
//主函数
int _tmain(int argc, char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(,);
glutInitWindowPosition(,);
glutCreateWindow("this is my window");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutKeyboardFunc(processNormalKeys);
glutMainLoop();
return ;
}

ps:

  镜面反射步骤:光源要设置镜面反射的属性、之后相应的物体要设置镜面反射的材质。还有自发光的属性emission,看起来就行物体在自己发光一样。

  尽量用glPushMatrix()和  glPopMatrix()进行绘图,而glLoadIdentity()在初始化和重绘的时候用。

  暂时还没发现回调函数中有捕获普通按键按下的函数,不过影响不是很大。长按相当于连续按多次。

OpenGL 回顾——简化版的窗体(包含鼠标控制,普通键位控制,以及镜面反射)的更多相关文章

  1. Opengl场景中加光照包含几个步骤

    http://zuoye.baidu.com/question/44e2a82d7ad5c0e1d33ddb9a40e0bf86.html  Opengl场景中加光照包含几个步骤,各个步骤实现用的函数 ...

  2. Extjs 窗体居中,双重窗体弹出时清除父窗体的鼠标事件

    这个是监控窗体缩放的事件 缩放中居中主要在 'beforeshow' 和 'destroy'两个事件里面监控 var EditTempWindow; Ext.EventManager.onWindow ...

  3. js鼠标及对象坐标控制属性详细解析

    对js鼠标及对象坐标控制属性进行了详细的分析介绍.  offsetTop获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算顶端位置. offsetLeft获取对象相对于版面或由 ...

  4. (转)C# WinForm中 获得当前鼠标所在控件 或 将窗体中鼠标所在控件名显示在窗体标题上

    原文地址:http://www.cnblogs.com/08shiyan/archive/2011/04/14/2015758.html /********************** * 课题:将窗 ...

  5. C#监听窗体新建/鼠标移入移出

    在新建window窗体时会激活方法,并循环所有窗体,鼠标移动在重写方法的页面中也会激活 winform直接在继承了From窗体cs中 protected override void WndProc(r ...

  6. ogre3D学习基础10 -- 键盘控制与鼠标控制(直接控制)

    要实现键盘,鼠标对场景的控制,首先要帧监听,就是在每一帧的渲染前后对它进行操作.这里的操作没有用到缓冲区,只是简单的直接获取. 1.这些步骤和前面的一样,直接上代码,操作还是在createScene函 ...

  7. WPF窗体隐藏鼠标光标的方法

    原文:WPF窗体隐藏鼠标光标的方法 要引用 System.Windows.Input;   Mouse.OverrideCursor = Cursors.None; 去掉 Override 则使用: ...

  8. matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色

    一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...

  9. 高阶篇:4.2.3)DFMEA现有设计:预防控制与探测控制

    本章目的:在现有设计中,明确预防控制与探测控制的定义和手段. 1.现有控制的填写部位: 2.现行设计控制(h)定义: 作为设计过程的一部分,现行设计控制是已经实施或承诺的活动,它将确保设计充分考虑设计 ...

随机推荐

  1. gradle的maven plugin使用

    在分布式系统开发中,基于gradle的项目,要共享jar一般是借助maven私服.那么gradle的maven插件如何做到上传binary jar,source jar, javadoc jar到私服 ...

  2. 谈C#中的Delegate

    引言 Delegate是Dotnet1.0的时候已经存在的特性了,但由于在实际工作中一直没有机会使用Delegate这个特性,所以一直没有对它作整理.这两天,我再度翻阅了一些关于Delegate的资料 ...

  3. 基于EasyUI实现windows桌面

    之前为大家介绍了 基于jquery tool实现的windows桌面效果,今天给大家带来一款基于EasyUI实现windows桌面.这款桌面适用浏览器:360.FireFox.Chrome.Safar ...

  4. Linux下的lds链接脚本基础

    转载:http://soft.chinabyte.com/os/104/12255104.shtml   今天在看uboot引导Linux部分,发现要对链接脚本深入了解,才能知道各个目标文件的内存分布 ...

  5. MySQL无视密码进入Server

    在[mysqld]的段中加上一句:skip-grant-tables 如下 [mysqld] skip-grant-tables 即可不输入密码就可以进入mysql server,然后就可以随便修改数 ...

  6. .Net中的socket编程例子

    vb2010: '发送端代码Public Class Form1    Inherits System.Windows.Forms.FormPrivate Sub Button1_Click(ByVa ...

  7. C. Ilya and Sticks

    C. Ilya and Sticks time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. PostgreSQL异步客户端(并模拟redis 数据结构)

    以前为了不在游戏逻辑(对象属性)变更时修改数据库,就弄了个varchar字段来表示json,由服务器逻辑(读取到内存)去操作它. 但这对运维相当不友好,也不能做一些此Json数据里查询. 所以后面就用 ...

  9. 【Android 界面效果43】Android LayoutInflater的inflate方法中attachToRoot的作用

    我们在ListView的Adapter的getView方法里面经常会调用两个参数的inflate方法, mInflater.inflate(R.layout.adv_viewpager, null); ...

  10. 【Java线程池快速学习教程】

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...