• 大小: 47KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-01
  • 语言: 其他
  • 标签: OpenGL  glut  读取obj  

资源简介

实现读取obj文件并创建显示列表绘制图像,键盘可控制旋转、缩放图像功能

资源截图

代码片段和文件信息

// lesson12_suchunyin.cpp : 此文件包含 “main“ 函数。程序执行将在此处开始并结束。
//

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

int n = 30;            //每一次转动30°
GLdouble view[2] = { 08 };  //设置旋转观察点初始位置 
int i = 0;             //旋转次数控制
GLdouble r = view[1];  //观察点旋转半径
float t = 0.5;         //拉近拉远的距离

vector>vSets;  //存放顶点(xyz)坐标
vector>fSets;    //存放面的三个顶点索引
vector>lSets;    //存放线的顶点索引
vector>cSets;  //存放颜色
vector name;  //存放每一部分名称
GLint part = -1;       //每一部分的编号

string filePath = “D://计算机图形学//Squirtle.obj“;


void ObjLoader(string filename)
{
ifstream file(filename);
string line;
while (getline(file line))
{
if (line.substr(0 1) == “o“)
{
string str;
istringstream on(line.substr(2));
on >> str;
name.push_back(str);
part++;
}

else if (line.substr(0 1) == “c“)
{
vector color;   //记录面对应的颜色
GLfloat R G B A;
istringstream cl(line.substr(2));
cl >> R; cl >> G; cl >> B; cl >> A;
color.push_back(R);
color.push_back(G);
color.push_back(B);
color.push_back(A);
cSets.push_back(color);
}

else if (line.substr(0 1) == “v“)
{
vector Point;
GLfloat x y z;
istringstream s(line.substr(2));
s >> x; s >> y; s >> z;
Point.push_back(x);
Point.push_back(y);
Point.push_back(z);
vSets.push_back(Point);

}
else if (line.substr(0 1) == “f“)
{
vector vIndexSets(4);
GLint u;
GLint v;
GLint w;
istringstream vtns(line.substr(2));
vtns >> u; 
vtns >> v; 
vtns >> w;
vIndexSets[0] = u - 1;
vIndexSets[1] = v - 1;
vIndexSets[2] = w - 1;
vIndexSets[3] = part;
fSets.push_back(vIndexSets);
}
else if (line.substr(0 1) == “l“)
{
vector lIndexSets;
GLint s t;
istringstream vt(line.substr(2));
vt >> s; vt >> t;
lIndexSets.push_back(s - 1);
lIndexSets.push_back(t - 1);
lSets.push_back(lIndexSets);
}
}
file.close();
}

GLint Squirtle = 1;
GLint MatrixMode = 2;
GLint VIEW = 3;
void createList() {
glNewList(Squirtle GL_COMPILE);  //杰尼龟的显示列表

glBegin(GL_TRIANGLES);    //开始绘制面
for (int i = 0; i < fSets.size(); i++) {
GLfloat VN[3];
//三个顶点
GLfloat SV1[3];
GLfloat SV2[3];
GLfloat SV3[3];

if ((fSets[i]).size() != 4) {
cout << “面顶点数组有误!“ << endl;
}
else {
//配置颜色:壳一个颜色,身体和尾巴一个颜色
glColor4f(cSets[fSets[i][3]][0] cSets[fSets[i][3]][1] cSets[fSets[i][3]][2] cSets[fSets[i][3]][3]);

GLint firstVertexIndex = (fSets[i])[0];//取出顶点索引
GLint secondVertexIndex = (fSets[i])[1];
GLint thirdVertexIndex = (fSets[i])[2];

SV1[0] = (vSets[firstVertexIndex])[0];//第一个顶点
SV1[1] = (vSets[firstVertexIndex])[1];
SV1[2] = (vSets[firstVertexIndex])[2];

SV2[0] = (vSets[secondVertexIndex])[0]; //第二个

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件      156861  2020-05-11 00:02  ziyuan2\Squirtle.obj
     文件        7791  2020-06-17 11:27  ziyuan2\ziyuan2.cpp
     目录           0  2020-06-17 11:29  ziyuan2\

评论

共有 条评论