项目文件资源链接//download.csdn.net/download/H200102/12101806
一、OpenGL导入三维模型
1.期末的图形学作业要做三维机器人,要求:可以转换视角;光照;机器人可以移动(局部运动);
2.查看资料后发现,发现大部分都是采用画出机器人各部分(几何图形,正方形长方形圆柱体)后组装的方式,我采用导入现有模型(三维模型)的方式,这样的模型比我自己画出的模型更美观和好看,
3.之后再给机器人贴纹理,渲染环境,设置光照等,设置键盘响应函数移动机器人,使机器人身体运动,旋转观察机器人
4.总结:最终实现了能够立体观察机器人,机器人能够运动(左右上下移动),旋转,放大缩小机器人。
但没有实现机器人的局部运动,比如只是机器人的手动或者脚动,机器人的纹理也没有贴(纹理部分自己没有学习,有空有心情再学,专门挑了一个不需要贴纹理的机器人)
二、实现步骤
方式一:使用deep exploration软件
1.先寻找一个obj模型,使用deep exploration将模型转换成cpp文件
2.将obj模型的cpp文件导入VS中,或者将cpp文件内容粘贴在VS中的项目中
3.deep exploration将模型转换成的cpp文件,是使用显示列表将模型画出来,显示列表存储了模型的顶点数据,光照材质等内容
4.在cpp文件中添加如下代码内容
#include <gl/glaux.h>
#include <gl/glu.h>
#include <GL/glut.h>
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
#include "math.h"
#include <stdio.h>
int flag = 1;
double front_Point_x, front_Point_y, front_Point_z;
double pos_Up[3], pos_Down[3], pos_Motion[3];
double viewmatrix[16], modelviewmatrix[16];
#define GLUT_MIDDLE_UP_BUTTON 0x0003
#define GLUT_MIDDLE_DOWN_BUTTON 0x0004
float PI = 3.141592654;
int listnum;//导入变量
GLfloat xangle = 0.0;
GLfloat yangle = 0.0;
GLfloat oDistance = 5.0;
int cacheX = 0;
int cacheY = 0;
int xSpeed = 1;
int ySpeed = 1;
BOOL light = true; // 光源的开/关
BOOL lp = true; // L键按下了么?
GLfloat LightAmbient[] = {
0.5f, 0.5f, 0.5f, 1.0f }; //环境光参数
GLfloat LightDiffuse[] = {
0.5f, 0.5f, 0.5f, 1.0f }; // 漫射光参数,不要全设置为0
GLfloat LightPosition[] = {
0.0f, 0.0f, 2.0f, 1.0f }; // 光源位置
static GLfloat angle = 0.0;
static GLfloat movex = 0.0;
static GLfloat movey = 0.0;
static GLfloat len = 15.0;
static GLint x = 0.0, y = 0.0, z = 0.0;
/*
该部分是cpp文件内容
*/
/*绘制*/
void motion(int x, int y) //鼠标响应事件
{
if (x > cacheX)
{
yangle = yangle - xSpeed;
}
if (x < cacheX)
{
yangle = yangle + xSpeed;
}
if (y > cacheY)
{
xangle = xangle + ySpeed;
}
if (y < cacheY)
{
xangle = xangle - ySpeed;
}
glutPostRedisplay();
cacheX = x;
cacheY = y;
}
/*
void setView() //设置观察角度
{
glRotatef(10, 1.0, 0.0, 0.0); //设置opengl中绘制实体的自转方式,即物体如何旋转
glRotatef(22, 0.0, 1.0, 0.0);
glTranslatef(-20.5, -10.0, -55.0);
/*沿X轴正方向平移x个单位(x是有符号数)
沿Y轴正方向平移y个单位(y是有符号数)
沿Z轴正方向平移z个单位(z是有符号数)
glGetDoublev(GL_MODELVIEW_MATRIX, viewmatrix);
}
*/
void SetRC() //设置渲染
{
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
glShadeModel(GL_SMOOTH);/*设置着色模式,解决实心图形内部空间颜色填充,平滑着色*/
glFrontFace(GL_CW);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);/*设置颜色混合,透明度叠加*/
glHint(GL_LINE_SMOOTH, GL_NICEST); /* 设置反面为边缘绘制方式*/
glEnable(GL_DEPTH_TEST);
//glPolygonMode(GL_BACK, GL_FILL); // 设置模型背面为实体
//glPolygonMode(GL_BACK, GL_LINE);
/*
glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充方式
glPolygonMode(GL_BACK, GL_LINE); // 设置反面为边缘绘制方式
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式*/
glEnable(GL_COLOR_MATERIAL);
}
void renderWorld() //模拟场景
{
glFrontFace(GL_CCW); //逆时针表示正面
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 设置多边形的正面和背面为实体,填充
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // 设置多边形的正面和背面为线性,不填充
float oXhudu = PI / (180 / xangle); //沿着X轴旋转的角度
float oYhudu = PI / (180 / yangle); //沿着Y轴旋转的角度
//设置场景坐标
GLfloat btm = oDistance * cos(oXhudu);
GLfloat vpY = oDistance * sin