《图形编程技术学习》(二十七)这是一个改错题

一、原题

代码中有错误导致什么都没画出,你能找出错误吗?源码老师可能是用VS写的,相应注释我这边打开是乱码的,可能用VS的同学能看到,所以也贴出来了。

// OpenGLStarter.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

//–Ë“™∞¸∫¨µƒÕ∑Œƒº˛
#include <windows.h>
#include <GL/freeglut.h>

//∂®“ ‰≥ˆ¥∞ø⁄µƒ¥Û–°
#define WINDOW_HEIGHT 300
#define WINDOW_WIDTH 500

//…„œÒª˙¿ÎŒÔõƒæ‡¿Î
float G_fDistance = 3.6f;
//ŒÔõƒ–˝◊™Ω«∂» 
float G_fAngle_horizon = 0.0;
float G_fAngle_vertical = 0.0f;


void myinit(void);
void myReshape(GLsizei w, GLsizei h);
void display(void);

//œÏ”¶º¸≈à ‰»Î, ¥”∂¯…Ë∂®ŒÔÓ∆Ω¸“∆‘∂“‘º∞–˝◊™µƒªÿµ˜∫Ø ˝
void processSpecialKeys(int key, int x, int y);
void processNormalKeys(unsigned char key,int x,int y);



//÷˜∫Ø ˝
int main(int argc, char* argv[])
{
	glutInit(&argc, argv);

	//≥ı ºªØOPENGLœ‘ æ∑Ω Ω
	glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA);

	//…Ë∂®OPENGL¥∞ø⁄Œª÷√∫Õ¥Û–°
	glutInitWindowSize (500, 500); 
	glutInitWindowPosition (100, 100);
		
	//¥Úø™¥∞ø⁄
	glutCreateWindow ("OpenGL");

	//µ˜”√≥ı ºªØ∫Ø ˝
    myinit();

	//…Ë∂®¥∞ø⁄¥Û–°±‰ªØµƒªÿµ˜∫Ø ˝
	glutReshapeFunc(myReshape);

	//…Ë∂®º¸≈Ãøÿ÷∆µƒªÿµ˜∫Ø ˝
	glutSpecialFunc(processSpecialKeys);
	glutKeyboardFunc(processNormalKeys);
	
	//ø™ ºOPENGLµƒ—≠ª∑
	glutDisplayFunc(display); 
	glutIdleFunc(display);

	glutMainLoop();

	return 0;
}


//”√ªß≥ı ºªØ∫Ø ˝
void myinit(void)
{
    //your initialization code
	glEnable(GL_DEPTH_TEST);
}

//¥∞ø⁄¥Û–°±‰ªØ ±µƒªÿµ˜∫Ø ˝
void myReshape(GLsizei w, GLsizei h)
{
	//…Ë∂® ”«¯
    glViewport(0, 0, w, h);

	//…Ë∂®Õ∏ ”∑Ω Ω
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum (-1.0, 1.0, -1.0, 1.0, 10.0, 30.0);
}

//√øËÂOpenGL∂ºª·µ˜”√’‚∏ˆ∫Ø ˝£¨”√ªß”¶∏√∞—œ‘ æ¥˙¬Î∑≈‘⁄’‚∏ˆ∫Ø ˝÷–
void display(void)
{
	//…Ë÷√«Â≥˝∆¡ƒªµƒ—’…´£¨≤¢«Â≥˝∆¡ƒª∫Õ…Ó∂»ª∫≥Â
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	//…Ë÷√≥…ƒ£–Õæÿ’Ûƒ£ Ω
    glMatrixMode(GL_MODELVIEW);

	//‘ÿ»Îµ•ŒªªØæÿ’Û
    glLoadIdentity();
	glRotatef(G_fAngle_horizon, 0.0f, 1.0f, 0.0f);
	glRotatef(G_fAngle_vertical, 1.0f, 0.0f, 0.0f);

	
	//ªÊ÷∆ŒÔÃÂ

	//ª≠“ª∏ˆ’˝∑Ω–Œ√Ê
	glColor3f(1.0f, 0.0f, 0.0f);
	glBegin(GL_QUADS);
		glVertex3f (-1.0, -1.0f, 0.0f);
		glVertex3f (1.0, -1.0f, 0.0f);
		glVertex3f (1.0, 1.0f, 0.0f);
		glVertex3f (-1.0, 1.0f, 0.0f);
	glEnd();

	//ª≠“ª∏ˆ≤Ë∫¯
	glColor3f(0.0f, 1.0f, 0.0f);
	glutWireTeapot(1.0);
//	glutSolidTeapot(1.0);


	//Ωªªª«∞∫Ûª∫≥«¯
	glutSwapBuffers();
}


void processSpecialKeys(int key, int x, int y)
{
	switch(key) {
		case GLUT_KEY_LEFT:
			G_fAngle_horizon -= 5.0f;
			break;
		case GLUT_KEY_RIGHT:
			G_fAngle_horizon += 5.0f;
			break;
		case GLUT_KEY_UP:
			G_fAngle_vertical -= 5.0f;
			break;
		case GLUT_KEY_DOWN:
			G_fAngle_vertical += 5.0f;
			break;
	}
}

void processNormalKeys(unsigned char key,int x,int y)
{
	switch(key) {
		case 97:	//"a"
			G_fDistance -= 0.3f;
			break;
		case 65:		//"A"
			G_fDistance += 0.3f;
			break;
		case 27:	//"esc"
			exit(0);
	}
}

二、介绍相关基础知识

1.glEnable

glEnable用于启用各种功能。功能由参数决定。与glDisable相对应。glDisable是用来关闭的。两个函数参数取值是一致的。

参数说明:

void glEnable(GLenum cap)

GLenum 是unsigned int类型

cap 是一个取值。由值决定启用的功能键。各种功能请看参数cap的取值表

代码示例:

glEnable(GL_BLEND);// 启用色彩混合

说明:

glEnable不能写在glBegin和glEnd两个函数中间。

参数cap的取值

2.glClearColor

glClearColor (0.0,0.0,0.0,0.0);//设置清除颜色

glClear(GL_COLOR _ BUFFER_ BIT);//把窗口清除为当前颜色

glClearDepth(1.0);//指定深度缓冲区每个像素需要的值

glClear(GLDEPTHBUFFER_BIT);//清除深度缓冲区

我们知道,像素颜色在图形硬件中的存储方式有两种

(1) RGBA

(2)像素索引

缓冲区的种类

glClear(glBitField mask);

3. glBegin

函数原型:

void glBegin(GLenum mode)

glBegin() 是和glEnd()结合起来使用。

参数解析:

mode:创建元素的类型,比如:点,线等。可以是以下数值:

GL_POINTS:把每个顶点作为一个点进行处理,顶点n定义了点n,绘制N个点。

GL_ LINES : 把每个顶点作为一个独立的线段,顶点2n - 1和2n之间定义了n条线段,绘制N/2条线段

GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,绘制n-1条线段。

GL_LINE_LOOP: 绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,绘制n条线段。

GL_TRIANGLES: 把每个顶点作为一个独立的三角形,顶点3n-2,3n-1和3n定义了第n个三角形,绘制了N/3个三角形。

GL_TRIANGLE_STPIP:绘制一组相连的三角形,对于奇数n,顶点n,n+1,和n+2定义了第n个三角形;对于偶数n,顶点n+1,n和n+2定义了第n个三角形,绘制N-2个三角 形。

GL_QUADS: 绘制由四个顶点组成的一组单独的四边形。顶点4n-3,4n-2,4n-1和4n定义了第n个四边形。绘制了N/4个四边形。

GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1,2n,2n+2和2n+1定义了第n个四边形,绘制了N/2-1个 四边形。

GL_POLYGON: 绘制了一个凸多边形。顶点1到n定义了这个多边形。

注意:

OpenGL空间使用的右手系的定义,与屏幕水平方向一致,并方向向右的是x轴;与屏幕垂直方向一致,并方向向上的是y轴;与屏幕垂直方向,并方向向外的z 轴。而glTranslatef(),glScalef(),glRotate()等此类几何变换接口的作用是对当前模型空间进行几何变换,在glBegin()和glEnd()之间是无效的。因此,对模型的位置进行转换,要在glBegin()和glEnd()接口之前进行处理。

三、我的答题

#include <iostream>
#include <GLUT/GLUT.h>
#include <math.h>

using namespace std;


#define WINDOW_HEIGHT 300
#define WINDOW_WIDTH 500

float G_fDistance = 3.6f;
float G_fAngle_horizon = 0.0;
float G_fAngle_vertical = 0.0f;


void myinit(void)
{
    glEnable(GL_DEPTH_TEST);
    glClearColor(1.0, 1.0, 1.0, 1.0);
}

void myReshape(GLsizei w, GLsizei h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    //glFrustum (-1.0, 1.0, -1.0, 1.0, 10.0, 30.0);
    gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    
}

void display(void)
{
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glRotatef(G_fAngle_horizon, 0.0f, 1.0f, 0.0f);
    glRotatef(G_fAngle_vertical, 1.0f, 0.0f, 0.0f);
    glColor3f(1.0f, 0.0f, 0.0f);
    glBegin(GL_QUADS);
        glVertex3f (-1.0, -1.0f, 0.0f);
        glVertex3f (1.0, -1.0f, 0.0f);
        glVertex3f (1.0, 1.0f, 0.0f);
        glVertex3f (-1.0, 1.0f, 0.0f);
    glEnd();
    
    glColor3f(0.0f, 1.0f, 0.0f);
    glutWireTeapot(1.0);
    glutSwapBuffers();
}

void processSpecialKeys(GLint key, GLint x, GLint y)
{
    switch(key) {
        case GLUT_KEY_LEFT:
            G_fAngle_horizon -= 5.0f;
            break;
        case GLUT_KEY_RIGHT:
            G_fAngle_horizon += 5.0f;
            break;
        case GLUT_KEY_UP:
            G_fAngle_vertical -= 5.0f;
            break;
        case GLUT_KEY_DOWN:
            G_fAngle_vertical += 5.0f;
            break;
    }
    display();
}

void processNormalKeys(unsigned char key,int x,int y)
{
    switch(key) {
        case 97:    //"a"
            G_fDistance -= 0.3f;
            break;
        case 65:        //"A"
            G_fDistance += 0.3f;
            break;
        case 27:    //"esc"  glutMainLoop函数产生的是一个永无止境的循环。唯一的跳出循环的方法就是调用系统exit函数。
            exit(0);
    }
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize (500, 500);
    glutInitWindowPosition (100, 100);
    glutCreateWindow ("OpenGL");
    myinit();
    glutDisplayFunc(&display);
    glutReshapeFunc(myReshape);
    glutIdleFunc(display);
    glutSpecialFunc(processSpecialKeys);
    glutKeyboardFunc(processNormalKeys);
    glutMainLoop();
    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值