klaaa
新手上路

加入时间: 2003/03/15
文章: 8
原币: 25
|
时间: 2003-3-20 周四, 下午9:52 标题: OpenGL编程(5) |
|
|
OpenGL编程(5)
这次新东西不多,希望大家多看看例子,熟悉熟悉。
// OpenGL05.cpp
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glut.h>
#include <math.h>
#define GL_PI 3.14159265359f
long g_lShape=0;
void DrawMyShapes(void)
{
long i=0;
GLfloat x=0,y=0,z=0;
switch(g_lShape)
{
case 0:
glBegin(GL_POINTS);
glVertex3f(0.0f,0.0f,0.0f);
glEnd();
glBegin(GL_POINTS);
for(i=0;i<180;i++)
{
x=50.0f*(GLfloat)cos(i*5.0f*GL_PI/180.0f);
y=50.0f*(GLfloat)sin(i*5.0f*GL_PI/180.0f);
z=i*0.5f;
glVertex3f(x,y,z);
}
glEnd();
break;
case 1:
glBegin(GL_POINTS);
glVertex3f(0.0f,0.0f,0.0f);
glEnd();
glBegin(GL_LINE_STRIP);
for(i=0;i<180;i++)
{
x=50.0f*(GLfloat)cos(i*5.0f*GL_PI/180.0f);
y=50.0f*(GLfloat)sin(i*5.0f*GL_PI/180.0f);
z=i*0.5f;
glVertex3f(x,y,z);
}
glEnd();
break;
}
}
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glColor3f(0.0f,1.0f,0.0f);
DrawMyShapes();
glFinish();
glutSwapBuffers();
}
void ResetViewport(GLsizei width,GLsizei height)
{
if(height==0)height=1;
if(width==0)width=1;
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-100.0f,100.0f,-100.0f,100.0f,-100.0f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void RotateScene(int key,int x,int y)
{
static GLfloat xRot=0,yRot=0;
GLfloat RotStep=5.0f;
if(key==GLUT_KEY_LEFT)yRot-=RotStep;
if(key==GLUT_KEY_RIGHT)yRot+=RotStep;
if(key==GLUT_KEY_UP)xRot+=RotStep;
if(key==GLUT_KEY_DOWN)xRot-=RotStep;
if(key==GLUT_KEY_F1)g_lShape=0;
if(key==GLUT_KEY_F2)g_lShape=1;
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(xRot,1.0f,0.0f,0.0f);
glRotatef(yRot,0.0f,1.0f,0.0f);
glutPostRedisplay();
}
void InitializeRC(void)
{
glClearColor(0.0f,0.0f,1.0f,1.0f);
}
void TerminateRC(void)
{
// nothing to do
}
int main(void)
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutCreateWindow("OpenGL05");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ResetViewport);
glutSpecialFunc(RotateScene);
InitializeRC();
glutMainLoop();
TerminateRC();
return 0;
}
本例使用方向键和F1,F2键可以进行控制,大家看看吧。
GLfloat是OpenGL的数据类型,代表浮点数。
glBegin的参数决定了图元类型,下面给glBegin支持的图元:
GL_POINTS:创建单个的点。
GL_LINES:创建线段,每两点为一条线段,如果点的数量为单数,则忽略最后一个点。
GL_LINE_STRIP:创建折线条,即将各个点顺次连接起来。
GL_LINE_LOOP:创建首尾相连的折线条,同GL_LINE_STRIP相似,不过在第一个点和最后一个点之间多了一条线段。典型情况下,可以用来绘制GL_POLYGON不能处理的封闭区域。
GL_TRIANGLES:创建三角形,每三个点成为一个三角形,多余的不足三个的点将被忽略。
GL_TRIANGLE_STRIP:创建三角形条,每相邻三个点组成三角形,例如,123为一个三角形,234为下一个三角形。
GL_TRIANGLE_FAN:创建三角扇形,第一个点充当原点,其余每相邻两点同原点组成三角形,例如,123、134、145这样组成三角形。
GL_QUADS:创建四边形,每四点组成一个四边形,多余的点将被忽略。
GL_QUAD_STRIP:创建四边形条,即所有点两两一组,每相邻两组组成一个四边形,例如1234、3456、5678这样组成四边形。通常情况下较少使用。
GL_POLYGON:创建凸多边形。要求各点连接图形的边缘不能相交,通常情况下较少使用。
大家可以自己试试使用各种参数来绘图,多多熟悉,这次就到这里了。
klaaa, 2003.03.20. |
|