您的位置:首页 > 编程语言

OPENGL 游戏编程 第四章 投影 glut

2014-10-25 20:53 260 查看
#include "stdafx.h"
#include <Windows.h>
#include <GL/glew.h>
#include <GL/glut.h>

void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
}

void changeSize(int w, int h)
{
float ratio = 1.0 * w / h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glViewport(0, 0, w, h);
gluPerspective(45, ratio, 1, 1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, 5, 0, 0, -1, 0, 1, 0);
}

void DrawCube(float xpos = 0.0f, float ypos = 0.0f, float zpos = 0.0f)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glPushMatrix();
glBegin(GL_QUADS);
glVertex3f(0.0f, 0.0f, 0.0f);	// top face
glVertex3f(0.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);	// right face
glVertex3f(0.0f, -1.0f, 0.0f);
glVertex3f(0.0f, -1.0f, -1.0f);
glVertex3f(0.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, 0.0f, 0.0f);	// left face
glVertex3f(-1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, -1.0f, 0.0f);	// bottom face
glVertex3f(0.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, -1.0f);	// back face
glVertex3f(-1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(0.0f, -1.0f, -1.0f);
glEnd();

glutSwapBuffers();
}

void render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// load the identity matrix (clear to default position and orientation)
glLoadIdentity();

// position and size the cube
glTranslatef(0, 0.0, -5);
/*glRotatef(15.0, 1.0, 0.0, 0.0);
glRotatef(30.0f, 0.0, 1.0, 0.0);
glScalef(0.75, 0.75, 0.75);*/
DrawCube(0.0, 0.0, 0.0);
}

void UpdateProjection(bool toggle)
{
static bool usePerspective = toggle;

// select the projection matrix and clear it out
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// choose the appropriate projection based on the currently toggled mode
if (usePerspective)
{
// set the perspective with the appropriate aspect ratio
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 1000.0);
}
else
{
// set up an orthographic projection with the same near clip plane
glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, 1000.0);
}

// select modelview matrix and clear it out
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void ResizeScene(int width, int height)
{
// avoid divide by zero
if (height == 0)
{
height = 1;
}

// reset the viewport to the new dimensions
glViewport(0, 0, width, height);

// set up the projection, without toggling the projection mode
UpdateProjection(false);
}

int _tmain(int argc, char* argv[])
{
glutInit(&argc, argv);
init();
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(1000, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("hello");
glutDisplayFunc(render);
glutIdleFunc(render);
glutReshapeFunc(ResizeScene);
glutMainLoop();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: