《图形编程技术学习》(二十七)这是一个改错题
作者:互联网
一、原题
代码中有错误导致什么都没画出,你能找出错误吗?源码老师可能是用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;
}
标签:1.0,int,0.0,void,改错题,二十七,顶点,编程技术,GL 来源: https://blog.csdn.net/qq_39218906/article/details/100939440