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

📄 毕业设计view.cpp

📁 毕业设计作品
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		if(r == 0.0f)
		{
			theta = 0.0f;
			phi = 0.0f;
		}
		else
		{
			if(z == 0.0f)
			{
				phi = 3.14159265f / 2.0f;
			}				
			else
			{
				phi = facos(z / rho);
			}				
			
			if(y == 0.0)
			{
				theta = 3.141592365f / 2.0f;
			}				
			else
			{
				theta = fasin(y / r) + (3.14159265f / 2.0f);
			}
			
			
		}
		
		model->texcoords[2 * i + 0] = theta / 3.14159265f;
		model->texcoords[2 * i + 1] = phi / 3.14159265f;
	}
	
	group = model->groups;
	while(group)
	{
		for (i = 0; i < group->numtriangles; i++)
		{
			T(group->triangles[i]).tindices[0] = T(group->triangles[i]).nindices[0];
			T(group->triangles[i]).tindices[1] = T(group->triangles[i]).nindices[1];
			T(group->triangles[i]).tindices[2] = T(group->triangles[i]).nindices[2];
		}
		group = group->next;
	}
}

GLvoid CMyView::glmDelete(GLMmodel* model)
{
	GLMgroup* group;
	GLuint i;
	
	assert(model);
	
	if (model->pathname)
	{
		free(model->pathname);
	}
	if (model->mtllibname)
	{
		free(model->mtllibname);
	}
	if (model->vertices)
	{
		free(model->vertices);
	}
	if (model->normals)
	{
		free(model->normals);
	}
	if (model->texcoords)
	{
		free(model->texcoords);
	}
	if (model->facetnorms)
	{
		free(model->facetnorms);
	}		
	if (model->triangles)
	{
		free(model->triangles);
	}
	if (model->materials)
	{
		for (i = 0; i < model->nummaterials; i++)
		{
			free(model->materials[i].name);
		}
		
	}
	free(model->materials);

	while(model->groups)
	{
		group = model->groups;
		model->groups = model->groups->next;
		free(group->name);
		free(group->triangles);
		free(group);
	}
	
	free(model);
}

GLMmodel* CMyView::glmReadOBJ(char* filename)
{
	GLMmodel* model;
	FILE*     file;
	GLuint i;
	
	/* 打开文件 */
	file = fopen(filename, "r");
	if (!file)
	{
		fprintf(stderr, "glmReadOBJ() failed: can't open data file \"%s\".\n",
			filename);
		exit(1);
	}
	
	/* 分配一个新模型 */
	model = (GLMmodel*)malloc(sizeof(GLMmodel));
	model->pathname      = strdup(filename);
	model->mtllibname    = NULL;
	model->numvertices   = 0;
	model->vertices      = NULL;
	model->selected      = NULL;
	model->numnormals    = 0;
	model->normals       = NULL;
	model->numtexcoords  = 0;
	model->texcoords     = NULL;
	model->numfacetnorms = 0;
	model->facetnorms    = NULL;
	model->numtriangles  = 0;
	model->triangles     = NULL;
	model->nummaterials  = 0;
	model->materials     = NULL;
	model->numgroups     = 0;
	model->groups        = NULL;
	model->position[0]   = 0.0;
	model->position[1]   = 0.0;
	model->position[2]   = 0.0;
	
	glmFirstPass(model, file);
	
	/* 分配内存 */
	model->vertices = (GLfloat*)malloc(sizeof(GLfloat) *
		3 * (model->numvertices + 1));
	model->selected = (GLboolean*)malloc(sizeof(GLboolean) *
		(model->numvertices + 1));
	model->triangles = (GLMtriangle*)malloc(sizeof(GLMtriangle) *
		model->numtriangles);

	if (model->numnormals)
	{
		model->normals = (GLfloat*)malloc(sizeof(GLfloat) *
			3 * (model->numnormals + 1));
	}
	if (model->numtexcoords)
	{
		model->texcoords = (GLfloat*)malloc(sizeof(GLfloat) *
			2 * (model->numtexcoords + 1));
	}
	
	rewind(file);
	
	glmSecondPass(model, file);

	for (i = 0; i < model->numvertices; i++)
	{
		model->selected[i] = FALSE;
	}
	/* 关闭文件 */
	fclose(file);
	
	return model;
}

/*绘制模型 */
GLvoid CMyView::glmDraw(GLMmodel* model, GLuint mode)
{
	static GLuint i;
	static GLMgroup* group;
	static GLMtriangle* triangle;
	static GLMmaterial* material;
	
	assert(model);
	assert(model->vertices);
	
	if (mode & GLM_FLAT && !model->facetnorms)
	{
		mode &= ~GLM_FLAT;
	}

	if (mode & GLM_SMOOTH && !model->normals)
	{
		mode &= ~GLM_SMOOTH;
	}

	if (mode & GLM_TEXTURE && !model->texcoords)
	{
		mode &= ~GLM_TEXTURE;
	}

	if (mode & GLM_FLAT && mode & GLM_SMOOTH)
	{
		mode &= ~GLM_FLAT;
	}

	if (mode & GLM_COLOR && !model->materials)
	{
		mode &= ~GLM_COLOR;
	}

	if (mode & GLM_MATERIAL && !model->materials)
	{
		mode &= ~GLM_MATERIAL;
	}

	if (mode & GLM_COLOR && mode & GLM_MATERIAL)
	{
		mode &= ~GLM_COLOR;
	}

	if (mode & GLM_COLOR)
	{
		glEnable(GL_COLOR_MATERIAL);
	}

	else if (mode & GLM_MATERIAL)
	{
		glDisable(GL_COLOR_MATERIAL);
	}

	group = model->groups;

	while (group)
	{
		if (mode & GLM_MATERIAL)
		{
			material = &model->materials[group->material];
			glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material->ambient);
			glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material->diffuse);
			glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material->specular);
			glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, material->shininess);
		}
		
		if (mode & GLM_COLOR)
		{
			material = &model->materials[group->material];
			glColor3fv(material->diffuse);
		}
		
		glBegin(GL_TRIANGLES);

		for (i = 0; i < group->numtriangles; i++)
		{
			triangle = &T(group->triangles[i]);
			
			if (mode & GLM_FLAT)
			{
				glNormal3fv(&model->facetnorms[3 * triangle->findex]);
			}
			
			if (mode & GLM_SMOOTH)
			{
				glNormal3fv(&model->normals[3 * triangle->nindices[0]]);
			}

			if (mode & GLM_TEXTURE)
			{
				glTexCoord2fv(&model->texcoords[2 * triangle->tindices[0]]);
			}

			glVertex3fv(&model->vertices[3 * triangle->vindices[0]]);
			
			if (mode & GLM_SMOOTH)
			{
				glNormal3fv(&model->normals[3 * triangle->nindices[1]]);
			}
			
			if (mode & GLM_TEXTURE)
			{
				glTexCoord2fv(&model->texcoords[2 * triangle->tindices[1]]);
			}				
			glVertex3fv(&model->vertices[3 * triangle->vindices[1]]);
			
			if (mode & GLM_SMOOTH)
			{
				glNormal3fv(&model->normals[3 * triangle->nindices[2]]);
			}
			
			if (mode & GLM_TEXTURE)
			{
				glTexCoord2fv(&model->texcoords[2 * triangle->tindices[2]]);
			}	
			
			glVertex3fv(&model->vertices[3 * triangle->vindices[2]]);			
		}
		glEnd();
		
		group = group->next;
	}
}

/*显示列表*/
GLuint CMyView::glmList(GLMmodel* model, GLuint mode)
{
	GLuint list;
	
	list = glGenLists(1);
	glNewList(list, GL_COMPILE);
	glmDraw(model, mode);
	glEndList();
	
	return list;
}

/*显示前视图*/
void CMyView::displayFront( GLenum mode )
{
	k = 1;/*清空走步控制参数*/
	glPushMatrix( );//
	
	glTranslated( 0.0, 0.0, -5.0 ); /*将模型向内平移5个单位*/
    glRotated( -90, 1.0, 0.0, 0.0 );/*将模型沿X轴顺时针旋转90度*/

	if( !ok )
	{
		glTranslated( 0.0, 0.0, up_down); /*上下平移*/
	    glTranslated( left_right, 0.0, 0.0); /*左右平移*/
	} 
	glRotated( m_xRotation, 0.0, 0.0, 1.0 );
	glRotated( m_yRotation, 1.0, 0.0, 0.0 );

    glRotated(rotate_left_right, 0.0, 0.0, 1.0 );/*左右旋转*/
	glRotated( rotate_up_down, 1.0, 0.0, 0.0 );/*上下旋转*/
    glTranslated(0.0, 0.0, -1.3*scaleMol);/*向下平移模型*/
   
	
	glPushMatrix();/*绘制开始*/
	
	glTranslated( 0.0, 0.0, 2.514*scaleMol );
    glRotated( (GLfloat)nod, 1.0, 0.0, 0.0 );/*点头*/
	glRotated( (GLfloat)throwHead, 0.0, 1.0, 0.0 );/*摇头*/
	glTranslated( 0.0, 0.0, -2.514*scaleMol );
	
	if( mode == GL_SELECT )
	{
		glLoadName( 1 );
	}
	glmDraw( head, GLM_SMOOTH | GLM_COLOR );/*绘制头模型*/	
    
	glPopMatrix();/*头绘制结束*/
	
	if( mode == GL_SELECT )
	{
		glLoadName( 2 );
	}

	glmDraw( body, GLM_SMOOTH | GLM_COLOR );/*绘制身体*/
    
	
	glPushMatrix();/*左腿开始绘制*/
	glTranslated( 0.12*scaleMol, 0.0, 1.51*scaleMol );
    glRotated( (GLfloat)leftDatui, 1.0, 0.0, 0.0 );/*左大腿旋转*/
	glTranslated( -0.12*scaleMol, 0.0, -1.51*scaleMol );
	
	if( mode == GL_SELECT )
	{
		glLoadName( 3 );
	}
   	glmDraw(leftdatui, GLM_SMOOTH | GLM_COLOR );
	glPushMatrix();/*左小腿开始绘制*/
	glTranslated( 0.164*scaleMol, -0.07*scaleMol, 0.81*scaleMol );
    glRotated( -(GLfloat)leftDatui, 1.0, 0.0, 0.0 );/*左小腿旋转*/
	glTranslated( -0.164*scaleMol, 0.07*scaleMol, -0.81 *scaleMol);

	if( mode == GL_SELECT )
	{
		glLoadName( 4 );
	}
    glmDraw(leftxiaotui, GLM_SMOOTH | GLM_COLOR );
    glPushMatrix();/*左脚开始绘制*/

	if( mode == GL_SELECT )
	{
		glLoadName( 5 );
	}
    glmDraw(leftfoot, GLM_SMOOTH | GLM_COLOR ); 
    glPopMatrix();/*左脚绘制结束*/

	glPopMatrix();/*左小腿绘制结束*/

	glPopMatrix();/*左大腿绘制结束*/

	glPushMatrix();/*右腿开始绘制*/
	glTranslated( 0.12*scaleMol, 0.0, 1.51*scaleMol );
    glRotated( (GLfloat)rightDatui, 1.0, 0.0, 0.0 );/*右腿旋转*/
	glTranslated( -0.12*scaleMol, 0.0, -1.51 *scaleMol);

	if( mode == GL_SELECT )
	{
		glLoadName( 6 );
	}
    glmDraw(rightdatui, GLM_SMOOTH | GLM_COLOR );
	glPushMatrix();/*右小腿工始绘制*/
	glTranslated( 0.164*scaleMol, -0.07*scaleMol, 0.81 *scaleMol);
    glRotated( -(GLfloat)rightDatui, 1.0, 0.0, 0.0 );/*右小腿旋转*/
	glTranslated( -0.164*scaleMol, 0.07*scaleMol, -0.81*scaleMol );

	if( mode == GL_SELECT )
	{
		glLoadName( 7 );
	}
    glmDraw(rightxiaotui, GLM_SMOOTH | GLM_COLOR );
    glPushMatrix();/*右脚开始绘制*/

	if( mode == GL_SELECT )
	{
		glLoadName( 8 );
	}
    glmDraw(rightfoot, GLM_SMOOTH | GLM_COLOR ); 
    glPopMatrix();/*右脚绘制结束*/
    glPopMatrix();/*右小腿绘制结束*/
	glPopMatrix();/*右大腿绘制结束*/


	glPushMatrix();/*左臂开始绘制*/

	glTranslated(0.0, 0.05*scaleMol, 2.23*scaleMol);
	glRotated( (GLfloat)leftHand, 1.0, 0.0, 0.0 );/*左臂旋转*/
	glTranslated(0.0, -0.05*scaleMol, -2.23*scaleMol); 
	
	if( mode == GL_SELECT )
	{
		glLoadName( 9 );
	}
	glPushMatrix();/*将左臂向内旋转30度*/
	glTranslated( 0.25*scaleMol, 0.0, 2.24*scaleMol );
	glRotated( 30, 0.0, 1.0, 0.0 );
	glTranslated( -0.25*scaleMol, 0.0, -2.24*scaleMol );
	glmDraw(leftbi, GLM_SMOOTH | GLM_COLOR );
	
    glPushMatrix();/*左肘开始绘制*/
    glTranslated(0.75*scaleMol, 0.05*scaleMol, 1.95*scaleMol);
    glRotated( (GLfloat)leftHand*0.6, 1.0, 0.0, 0.0);/*左肘旋转*/
	glTranslated(-0.75*scaleMol, -0.05*scaleMol, -1.95*scaleMol);

	if( mode == GL_SELECT )
	{
		glLoadName( 10 );
	}
	glmDraw(leftzhou, GLM_SMOOTH | GLM_COLOR );
    glPushMatrix();/*左手开始绘制*/

	if( mode == GL_SELECT )
	{
		glLoadName( 11 );
	}
    glmDraw(lefthand, GLM_SMOOTH | GLM_COLOR ); 
    glPopMatrix();/*左手绘制结束*/
    glPopMatrix();/*左肘绘制结束*/
    glPopMatrix();/*左臂绘制结束*/
	glPopMatrix();



	glPushMatrix();/*右臂开始绘制*/
	glTranslated(0.0, 0.05*scaleMol, 2.23*scaleMol);
	glRotated( (GLfloat)rightHand, 1.0, 0.0, 0.0 );/*右臂旋转*/
	glTranslated(0.0, -0.05*scaleMol, -2.23*scaleMol);

	if( mode == GL_SELECT )
	{
		glLoadName( 12 );
	}
	glPushMatrix();/*将右臂向内旋转30度*/
	glTranslated( -0.25*scaleMol, 0.0, 2.24*scaleMol );
	glRotated( -30, 0.0, 1.0, 0.0 );
	glTranslated( 0.25*scaleMol, 0.0, -2.24*scaleMol );
    glmDraw(rightbi, GLM_SMOOTH | GLM_COLOR );
	glPushMatrix();/*右肘开始绘制*/
	glTranslated(0.75*scaleMol, 0.05*scaleMol, 1.95*scaleMol);
	glRotated( (GLfloat)rightHand, 1.0, 0.0, 0.0 );/*右肘旋转*/
	glTranslated(-0.75*scaleMol, -0.05*scaleMol, -1.95*scaleMol);

	if( mode == GL_SELECT )
	{
		glLoadName( 13 );
	}
    glmDraw(rightzhou, GLM_SMOOTH | GLM_COLOR );
    glPushMatrix();/*右手开始绘制*/
	if( mode == GL_SELECT )
	{
		glLoadName( 14 );
	}
    glmDraw(righthand, GLM_SMOOTH | GLM_COLOR ); 
    glPopMatrix();/*右手绘制结束*/
    glPopMatrix();/*右肘绘制结束*/
    glPopMatrix();/*右臂绘制结束*/
	glPopMatrix();
	glPopMatrix();/*全部绘制结束*/

}

void CMyView::displayBeside( GLenum mode )
{
	glPushMatrix( );//
	
	glTranslated( 0.0, 0.0, -5.0 ); /*将模型向内平移5个单位*/

	glRotated( m_xRotation, 0.0, 0.0, 1.0 );

⌨️ 快捷键说明

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