⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program.cpp

📁 此文档是用vistual studio 2005 开发的用来描述3D-tree 的生长过程
💻 CPP
字号:
/*
* Copyright (c) 2008 Lauming chen, Soochow University.
* All right reserved.
*
*
*/
#ifdef WIN32
#include <windows.h>
#endif

#include <iostream>
#include <GL/glut.h> /* Header File For The GLUT Library */
#include <GL/gl.h> /* Header File For The OpenGL32 Library */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "global.h"
#include "MyTree.h"


#define LIGHTING_MENU_ITEM			0x01
#define TEXTURE_MENU_ITEM			0x02
#define LAND_MENU_ITEM				0x03
#define SKY_MENU_ITEM				0x04
#define ENGLISH_MENU_ITEM			0x11
#define CHINESE_SIMPLE_MENU_ITEM	0x12
#define CHINESE_TRADITION_MENU_ITEM	0x13

#define ESCAPE 27 /* ascii code for the escape key */
#define SPACE 32 /* ascii code for the space key */

int isFullScreen = 0;
int isDrawLand = 1;
int isDrawSky = 1;

int startX = 0, startY = 0, endX = 0, endY = 0;
float rotateX = 0, rotateY = 0;
float translateX = 0.0f, translateY = 0.0f, translateZ = 0.0f;
float changeStep = 0.0f;
int mouseButtons[5] = { GLUT_UP, GLUT_UP, GLUT_UP, GLUT_UP, GLUT_UP };

void createMenus();

int totalNode = 0;
void initParameter( void ) {
	setWindowSize( 0, 0, 800, 600 );
	isFullScreen = 0;
	translateZ = -12.0f;
	changeStep = 0.1f;
	window.left = ( glutGet( GLUT_SCREEN_WIDTH ) - window.width ) / 2;
	window.top = ( glutGet( GLUT_SCREEN_HEIGHT ) - window.height ) / 2;
}

void initGL() {
	float light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
	float light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
	float light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
	float light_position[] = { 1.0, 1.0, 1.0, 0.0 };

	glShadeModel( GL_SMOOTH );
	glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
	glClearDepth( 1.0f );

	glEnable( GL_TEXTURE_2D ); /* Enable Texture Mapping */
	glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); /* Pixel Storage Mode To Byte Alignment */
	glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

	glLightfv( GL_LIGHT0, GL_AMBIENT, light_ambient );
	glLightfv( GL_LIGHT0, GL_DIFFUSE, light_diffuse );
	glLightfv( GL_LIGHT0, GL_SPECULAR, light_specular );
	glLightfv( GL_LIGHT0, GL_POSITION, light_position );
	glEnable( GL_LIGHTING );
	glEnable( GL_LIGHT0 );

	glEnable( GL_COLOR_MATERIAL );

	glEnable( GL_DEPTH_TEST );
	glDepthFunc( GL_LEQUAL );
	//glEnable(GL_LINE_SMOOTH); // 启用反走样
}

void display( void ) {
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
	glLoadIdentity();

	glTranslatef( 0.0f, -4.0f, 0.0f );
	glTranslatef( translateX, translateY, translateZ );
	glRotatef( rotateY, 1.0f, 0.0f, 0.0f );
	glRotatef( rotateX, 0.0f, 1.0f, 0.0f );

	//if ( isDrawSky == 1 ) {
	//	drawSky( textrue.sky );
	//}

	//if ( isDrawLand == 1 ) {
	//	drawLand( 50.0f, textrue.ground );
	//}


	// drawMyTree( textrue.bark, textrue.leaf );
	//Branch br = Branch( 10, 1.0f, 70.0f, 25.0f, 0.1f, "bark.bmp" );
	MyTree tr = MyTree( 11, 1.0f, 0.1f );
	tr.draw();
	//br.draw();
	

	glutSwapBuffers();
}

void reshape( int width, int height ) {
	if ( height == 0 ) {
		height = 1;
	}
	glViewport( 0, 0 , width, height );
	glMatrixMode( GL_PROJECTION );
	glLoadIdentity();
	gluPerspective( 45.0f, ( GLfloat )width / ( GLfloat )height, 0.1f, 100.0f );
	glMatrixMode( GL_MODELVIEW );
	glLoadIdentity();
}

void mouseMove( int x, int y ) {
	if ( mouseButtons[ GLUT_LEFT_BUTTON ] == GLUT_DOWN ) {
		rotateX = x - startX;
		rotateY = y - startY;
	}
}

void mouse( int button, int state, int x, int y ) {
	mouseButtons[ button ] = state;
	switch( button )
	{
	case GLUT_LEFT_BUTTON :
		if ( state == GLUT_DOWN ) {
			startX = x - rotateX;
			startY = y - rotateY;
		}
		break;
	case GLUT_MIDDLE_BUTTON :
		if ( state == GLUT_DOWN ) {
		}
		break;
	case GLUT_RIGHT_BUTTON :
		if ( state == GLUT_DOWN ) {
			//
		}
		break;
	default:
		break;
	}
}

void keyboard( unsigned char key, int x, int y ) {
	switch ( key ) {
		case ESCAPE:
			break;
		case SPACE :
			break;
		case 'w' :
		case 'W' :
			translateZ += 0.1;
			break;
		case 's' :
		case 'S' :
			translateZ -= 0.1;
			break;
		case 'a' :
		case 'A' :
			rotateX += 3;
			break;
		case 'd' :
		case 'D' :
			rotateX -= 3;
			break;
		case 'l' :
		case 'L' :
			if ( glIsEnabled( GL_LIGHTING ) == GL_FALSE ) {
				glEnable( GL_LIGHTING );
			} else {
				glDisable( GL_LIGHTING );
			}
			break;
		case 't' :
		case 'T' :
			if ( glIsEnabled( GL_TEXTURE_2D ) == GL_FALSE ) {
				glEnable( GL_TEXTURE_2D );
			} else {
				glDisable( GL_TEXTURE_2D );
			}
			break;
		default:
			break;
	}
}

void special_keys( int a_keys, int x, int y ) {
	switch ( a_keys ) {
		case GLUT_KEY_F1 :
			isFullScreen = !isFullScreen;
			if ( isFullScreen ) {
				window.left = glutGet( GLUT_WINDOW_X );
				window.top = glutGet( GLUT_WINDOW_Y );
				window.width = glutGet( GLUT_WINDOW_WIDTH );
				window.height = glutGet( GLUT_WINDOW_HEIGHT );
				glutFullScreen();
			} else {
				glutReshapeWindow( window.width, window.height );
				glutPositionWindow( window.left, window.top );
			}
			break;
		case GLUT_KEY_UP :
			translateY -= changeStep;
			break;
		case GLUT_KEY_DOWN :
			translateY += changeStep;
			break;
		case GLUT_KEY_LEFT :
			translateX += changeStep;
			break;
		case GLUT_KEY_RIGHT :
			translateX -= changeStep;
			break;
		default:
			break;
	}
}

void setFullScreen( int isFullScreen ) {
	if ( isFullScreen != 0 ) {
		glutFullScreen();
	} else {
		glutInitWindowSize( window.width, window.height );
		glutInitWindowPosition( window.left, window.top );
	}
}

void processMenuEvents( int option ) {
	switch ( option ) {
		case LIGHTING_MENU_ITEM :
			if ( glIsEnabled( GL_LIGHTING ) == GL_FALSE ) {
				glEnable( GL_LIGHTING );
			} else {
				glDisable( GL_LIGHTING );
			}
			break;
		case TEXTURE_MENU_ITEM :
			if ( glIsEnabled( GL_TEXTURE_2D ) == GL_FALSE ) {
				glEnable( GL_TEXTURE_2D );
			} else {
				glDisable( GL_TEXTURE_2D );
			}
			break;
		case LAND_MENU_ITEM :
			isDrawLand = -isDrawLand;
			break;
		case SKY_MENU_ITEM :
			isDrawSky = -isDrawSky;
			break;
		case ENGLISH_MENU_ITEM :
			createMenus();
			break;
		case CHINESE_SIMPLE_MENU_ITEM :
			createMenus();
			break;
		case CHINESE_TRADITION_MENU_ITEM :
			createMenus();
			break;
		default:
			break;
	}
}

int mainMenu = 0, langugeMenu = 0;
void createSubMenus( void ) {
	langugeMenu = glutCreateMenu( processMenuEvents );
	glutAddMenuEntry( "English", ENGLISH_MENU_ITEM );
	glutAddMenuEntry( "简体中文", CHINESE_SIMPLE_MENU_ITEM );
	glutAddMenuEntry( "繁體中文", CHINESE_TRADITION_MENU_ITEM );
}

void createMenus( void ) {
	createSubMenus();
	mainMenu = glutCreateMenu( processMenuEvents );
	glutAddMenuEntry( language.lightingMenuItem, LIGHTING_MENU_ITEM );
	glutAddMenuEntry( language.textureMenuItem, TEXTURE_MENU_ITEM );
	glutAddMenuEntry( language.landMenuItem, LAND_MENU_ITEM );
	glutAddMenuEntry( language.skyMenuItem, SKY_MENU_ITEM );
	glutAddSubMenu( language.langugeMenu, langugeMenu );
	glutAttachMenu( GLUT_RIGHT_BUTTON );
}

int main( int argc, char** argv ) {
	glutInit( &argc, argv );
	glutInitDisplayMode( GLUT_DEPTH | GLUT_RGBA | GLUT_DOUBLE );
	initParameter();
	setFullScreen( isFullScreen );
	glutCreateWindow( "3D-MyTree" );
	initGL();
	glutDisplayFunc( display );
	glutIdleFunc( display );
	glutReshapeFunc( reshape );
	glutKeyboardFunc( keyboard );
	glutSpecialFunc( special_keys );
	glutMouseFunc( mouse );
	glutMotionFunc( mouseMove );
	createMenus();

	glutMainLoop();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -