// 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. JS的setTimeout函数第一个参数问题

    setTimeout的第一个参数只能放一个无参的函数,更像放了一个函数指针在那里,如果要放带参数的话,就要拿个匿名函数包裹一下

  2. Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8

    在使用Eclipse 直接编译NDK,有时候会报类似以下错误 Android NDK: WARNING: APP_PLATFORM android-14 is larger than android: ...

  3. oc-20-多态

    /** 为什么父类可以访问子类继承自父类的方法,但是无法访问子类独有的方法? 1.编译器编译时: 编译器在编译时,只检查指针变量的类型,确定该指针变量类型里面有下面调用的方法,如果有该方法,编译器就认 ...

  4. 适用于各浏览器支持图片预览,无刷新异步上传js插件

    文件上传无疑是web应用中一个非常常用的功能,不管是PHP.jsp还是aspx.mvc等都会需要文件上传,但是众所周知当使用自带的文件上传功能时总会出现页面刷新的情况.当然现在有了html5这个好东西 ...

  5. 基于jQuery实现苹果Dock样式的菜单

    爱编程小编之前我们分享过相当数量的jQuery菜单了,今天要给大家带来一款Dock样式的jQuery菜单,用过苹果的朋友都知道,它的Dock菜单非常酷,配合漂亮的图标就更加绚丽了.效果图如下: 在线预 ...

  6. ubutun中安装nginx

    一.安装 sudo wget http://nginx.org/download/nginx-1.4.4.tar.gz sudo tar zxvf ng....cd nginx-1.4.4sudo . ...

  7. LeetCode5 Longest Palindromic Substring

    题意: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  8. 利用VBA+OO4O构造CTAIS开放式通用平台

    利用VBA+OO4O构造CTAIS开放式通用平台 2010-06-08 14:59:28 | 来源:税务信息化论文集 | 作者:于非 易飞 摘  要:文立足于CTAIS系统体系,探讨如何通过OO4O技 ...

  9. L - Fabled Rooks(中途相遇法和贪心)

    Problem F: Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the ...

  10. React Native学习-调取摄像头第三方组件:react-native-image-picker

    近期做的软件中图片处理是重点,那么自然也就用到了相机照相或者相册选取照片的功能. react-native中有image-picker这个第三方组件,但是0.18.10这个版本还不是太支持iPad. ...