OpenGL: 正交投影

代码如下:

#define GLUT_DISABLE_ATEXIT_HACK

#include "gl/glut.h"
#pragma comment(lib, "glut32.lib")

GLboolean Large = GL_FALSE; //坐标单位变大或变小
GLint Width;				//视区宽度
GLint Height;				//视区高度

//显示 回调函数
void OnDisplay(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glEnable(GL_DEPTH_TEST); //启用深度检测

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
	glRotatef(15.0f, 0.0f, 1.0f, 0.0f);

	glColor3f(0.7f, 0.5f, 0.3f);
	glutSolidTeapot(50.0f);

	glutSwapBuffers();
}
//窗口尺寸变化后的回调函数
void OnReShape(int w,int h)
{
	glViewport(0, 0, w, h);
	Width  = w;
	Height = h;
	glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式
	glLoadIdentity();

	if (0 != h)
	{
		GLfloat aspect =(float)w / (float)h;

		//设置三维投影区
		if(!Large)
		{
			if (w <= h) //较小的坐标单位
			{
				glOrtho(-100.0f, 100.0f, -100.0f / aspect, 100.0f / aspect, -100.0f, 100.0f);
			} 
			else
			{
				glOrtho(-100.0f * aspect, 100.0f * aspect, -100.0f, 100.0f, -100.0f, 100.0f);
			}
		}
		else
		{
			if (w <= h) //较大的坐标单位
			{
				glOrtho(-60.0f, 60.0f, -60.0f / aspect, 60.0f / aspect, -60.0f, 60.0f);
			} 
			else
			{
				glOrtho(-60.0f * aspect, 60.0f * aspect, -60.0f, 60.0f, -60.0f, 60.0f);
			}
		}
	}
}

void OnMouse(GLint button,GLint state,GLint x, GLint y)
{
	if(button == GLUT_LEFT_BUTTON && state == GLUT_UP) //鼠标左键释放
	{
		Large= !Large; //逻辑变量取反
	}
	OnReShape(Width, Height);
	glutPostRedisplay();
}

void SetupLights()
{
	GLfloat ambientLight[]  ={0.2f,  0.2f,  0.2f,  1.0f};//环境光
	GLfloat diffuseLight[]  ={0.9f,  0.9f,  0.9f,  1.0f};//漫反射
	GLfloat specularLight[] ={1.0f,  1.0f,  1.0f,  1.0f};//镜面光
	GLfloat lightPos[]      ={50.0f, 80.0f, 60.0f, 1.0f};//光源位置

	glEnable(GL_LIGHTING);			//启用光照
	glLightfv(GL_LIGHT0, GL_AMBIENT,  ambientLight);	//设置环境光源
	glLightfv(GL_LIGHT0, GL_DIFFUSE,  diffuseLight);	//设置漫反射光源
	glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);	//设置镜面光源
	glLightfv(GL_LIGHT0, GL_POSITION, lightPos);		//设置灯光位置
	glEnable(GL_LIGHT0);			//打开第一个灯光

	glEnable(GL_COLOR_MATERIAL);	//启用材质的颜色跟踪
	glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);	//指定材料着色的面
	glMaterialfv(GL_FRONT, GL_SPECULAR, specularLight); //指定材料对镜面光的反应
	glMateriali(GL_FRONT, GL_SHININESS, 100);			//指定反射系数
}
void main(int argc,char* argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(600, 480);
	glutCreateWindow("OpenGL正交投影");

	glutReshapeFunc(OnReShape);
	glutDisplayFunc(OnDisplay);
	glutMouseFunc(OnMouse);

	SetupLights();

	glutMainLoop();
}

运行效果如下:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值