• 大小: 113KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: C/C++
  • 标签: C++  

资源简介

用C++ 和opengl库函数实现多个雪人,而且可以和键盘交互,利用键盘来控制视角,变换场景

资源截图

代码片段和文件信息


#include 
#include 
#include 
#include 
#include 


float angle=0.0deltaAngle = 0.0ratio;
float x=0.0fy=1.75fz=5.0f;
float lx=0.0fly=0.0flz=-1.0f;
GLint snowman_display_list;
int deltaMove = 0;


void changeSize(int w int h)
{

// Prevent a divide by zero when window is too short
// (you cant make a window of zero width).
if(h == 0)
h = 1;

ratio = 1.0f * w / h;
// Reset the coordinate system before modifying
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Set the viewport to be the entire window
    glViewport(0 0 w h);

// Set the clipping volume
gluPerspective(45ratio11000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(x y z 
      x + lxy + lyz + lz
  0.0f1.0f0.0f);


}


void drawSnowMan() {


glColor3f(1.0f 1.0f 1.0f);

// Draw Body
glTranslatef(0.0f 0.75f 0.0f);
glutSolidSphere(0.75f2020);


// Draw Head
glTranslatef(0.0f 1.0f 0.0f);
glutSolidSphere(0.25f2020);

// Draw Eyes
glPushMatrix();
glColor3f(0.0f0.0f0.0f);
glTranslatef(0.05f 0.10f 0.18f);
glutSolidSphere(0.05f1010);
glTranslatef(-0.1f 0.0f 0.0f);
glutSolidSphere(0.05f1010);
glPopMatrix();

// Draw Nose
glColor3f(1.0f 0.5f  0.5f);
glRotatef(0.0f1.0f 0.0f 0.0f);
glutSolidCone(0.08f0.5f102);
}



GLuint createDL() {
GLuint snowManDL;

// Create the id for the list
snowManDL = glGenLists(1);

// start list
glNewList(snowManDLGL_COMPILE);

// call the function that contains the rendering commands
drawSnowMan();

// endList
glEndList();

return(snowManDL);
}

void initScene() {

glEnable(GL_DEPTH_TEST);
snowman_display_list = createDL();

}



void orientMe(float ang) {


lx = sin(ang);
lz = -cos(ang);
glLoadIdentity();
gluLookAt(x y z 
      x + lxy + lyz + lz
  0.0f1.0f0.0f);
}


void moveMeFlat(int i) {
x = x + i*(lx)*0.1;
z = z + i*(lz)*0.1;
glLoadIdentity();
gluLookAt(x y z 
      x + lxy + lyz + lz
  0.0f1.0f0.0f);
}

void renderScene(void) {

if (deltaMove)
moveMeFlat(deltaMove);
if (deltaAngle) {
angle += deltaAngle;
orientMe(angle);
}

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Draw ground

glColor3f(0.9f 0.9f 0.9f);
glBegin(GL_QUADS);
glVertex3f(-100.0f 0.0f -100.0f);
glVertex3f(-100.0f 0.0f  100.0f);
glVertex3f( 100.0f 0.0f  100.0f);
glVertex3f( 100.0f 0.0f -100.0f);
glEnd();

// Draw 36 SnowMen

for(int i = -3; i < 3; i++)
for(int j=-3; j < 3; j++) {
glPushMatrix();
glTranslatef(i*10.00j * 10.0);
glCallList(snowman_display_list);;
glPopMatrix();
}
glutSwapBuffers();
}

void pressKey(int key int x int y) {

switch (key) {
case GLUT_KEY_LEFT : deltaAngle = -0.01f;break;
case GLUT_KEY_RIGHT : deltaAngle = 0.01f;break;
case GLUT_KEY_UP : deltaMove = 1;brea

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件        530  2008-03-13 20:33  glutsnowman\glutsnowman.dsw

     文件      33792  2008-03-13 20:40  glutsnowman\glutsnowman.ncb

     文件      45056  2008-03-13 20:33  glutsnowman\Debug\vc60.pdb

     文件      15100  2008-03-13 20:33  glutsnowman\Debug\glutsnowman.obj

     文件     204883  2008-03-13 20:33  glutsnowman\Debug\glutsnowman.exe

     文件     369664  2008-03-13 20:33  glutsnowman\Debug\glutsnowman.pdb

     文件       1305  2008-03-13 20:33  glutsnowman\glutsnowman.plg

     文件       3883  2008-03-13 20:40  glutsnowman\glutsnowman.cpp

     文件      48640  2008-03-13 20:40  glutsnowman\glutsnowman.opt

     文件       4344  2008-03-13 20:40  glutsnowman\glutsnowman.dsp

     目录          0  2008-03-13 20:33  glutsnowman\Debug

     目录          0  2008-03-13 20:33  glutsnowman

----------- ---------  ---------- -----  ----

               727197                    12


评论

共有 条评论