📄 毕业设计view.cpp
字号:
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 + -