#include<Angel.h>
#include<mat.h>
#include<vector>
#include<string>
#include<fstream>
#include<sstream>
#pragma comment(lib,"glew32.lib")
const double DEFAULT_DELTA = 0.03; //旋转偏移量
int sign = 1; //控制是顺时针旋转还是逆时针旋转,1为顺时针旋转。
//矩阵的存储位置
GLint matrixLocation;
int mainWindow;//
int Xaxis = 0;
int Yaxis = 1;
int Zaxis = 2;
int Axis = Xaxis; //控制是x轴、y轴、z轴旋转。默认是x轴
vec3 Theta(0.0, 0.0, 0.0);
//Num_Vertices为顶点的个数
const int NUM_VERTICES = 8;
const vec4 vertexColors[NUM_VERTICES] = {
vec4(0.0, 0.0, 0.0, 1.0), // Black
vec4(1.0, 0.0, 0.0, 1.0), // Red
vec4(1.0, 1.0, 0.0, 1.0), // Yellow
vec4(0.0, 1.0, 0.0, 1.0), // Green
vec4(0.0, 0.0, 1.0, 1.0), // Blue
vec4(1.0, 0.0, 1.0, 1.0), // Magenta
vec4(1.0, 1.0, 1.0, 1.0), // White
vec4(0.0, 1.0, 1.0, 1.0) // Cyan
};
int nVertices = 0;//顶点数
int nFaces = 0;//面数
int nEdges;//边数
std::vector<vec4> points; //存放每个顶点的信息
std::vector<vec4> colors; //存放每个顶点的颜色信息
std::vector<vec4> vertices; //存放每个顶点的坐标信息
/*
存放每个顶点的坐标和颜色信息
*/
void storePoints(int a, int b, int c)
{
points.push_back(vertices[a]);
points.push_back(vertices[b]);
points.push_back(vertices[c]);
colors.push_back(vertexColors[a]);
colors.push_back(vertexColors[b]);
colors.push_back(vertexColors[c]);
}
/*
读取off文件
*/
void read_off(const std::string filename)
{
if (filename.empty()) {//如果文件为空,则直接返回
return;
}
std::ifstream fin;
int i = 0;
fin.open(filename);
std::string str;
fin >> str; //str的内容为OFF
fin >> nVertices; //顶点数
fin >> nFaces; //面数
fin >> nEdges; //边数
for (i = 0; i < nVertices; i++) //读取off中的点坐标数据,存放在points中
{
double n1 = 0;
double n2 = 0;
double n3 = 0;
double n4 = 0;
fin >> n1; //其坐标值有四个
fin >> n2;
fin >> n3;
fin >> n4;
vec4 new_vec3(n1, n2, n3, n4);
vertices.push_back(new_vec3);
}
for (i = 0; i < nFaces; i++) //读取每个面的信息
{
int n1 = 0;
int n2 = 0; //每行的第一个为顶点数,
int n3 = 0;
int n4 = 0;
fin >> n1;
fin >> n2;
fin >> n3;
fin >> n4;
storePoints(n2, n3, n4);
}
fin.close();
}
void init()
{
read_off("cube.off");
// 创建顶点数组对象
GLuint vao[1];
glGenVertexArrays(1, vao);
glBindVertexArray(vao[0]);
// 创建并初始化顶点缓存对象
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, points.size() * sizeof(vec4) + colors.size() * sizeof(vec4),
NULL, GL_STATIC_DRAW);
// 分别读取数据
glBufferSubData(GL_ARRAY_BUFFER, 0, points.size() * sizeof(vec4), &points[0]);
glBufferSubData(GL_ARRAY_BUFFER, points.size() * sizeof(vec4), colors.size() * sizeof(vec4), &colors[0]);
// 读取着色器并使用
GLuint program = InitShader("vshader.glsl", "fshader.glsl");
glUseProgram(program);
// 从顶点着色器中初始化顶点的位置
GLuint pLocation = glGetAttribLocation(program, "vPosition");
glEnableVertexAttribArray(pLocation);
glVertexAttribPointer(pLocation, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
// 从片元着色器中初始化顶点的颜色
GLuint cLocation = glGetAttribLocation(program, "vColor");
glEnableVertexAttribArray(cLocation);
glVertexAttribPointer(cLocation, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(points.size() * sizeof(vec4)));
// 获得矩阵存储位置
matrixLocation = glGetUniformLocation(program, "matrix");
// 白色背景
glClearColor(1.0, 1.0, 1.0, 1.0);
}
void display()
{
// 清理窗口
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 生成变换矩阵
mat4 m(1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
m = m*RotateX(Theta[Xaxis]); //绕x轴旋转
m = m*RotateY(Theta[Yaxis]); //绕y轴旋转
m = m*RotateZ(Theta[Zaxis]); //绕z轴旋转
// 从指定位置中传入变换矩阵
glUniformMatrix4fv(matrixLocation, 1, GL_TRUE, m);
glDrawArrays(GL_TRIANGLES, 0, points.size());
glFlush();
glutSwapBuffers();
}
// 复原Theta和Delta
void reset()
{
Theta = vec3(0.0, 0.0, 0.0);
}
//更新Theta的值
void update()
{
Theta[Axis] += sign * DEFAULT_DELTA; //通过修改些值来生成对应的变化矩阵
glutPostWindowRedisplay(mainWindow); //重新显示窗口
}
void mouse(int button, int state, int x, int y)
{
if (state == GLUT_DOWN)
{
switch(button)
{
//sign控制是顺时针旋转还是逆时针旋转,1为顺时针旋转。
case GLUT_LEFT_BUTTON: sign = -1; break;
case GLUT_RIGHT_BUTTON:sign = 1; break;
}
}
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 'x':case 'X':
Axis = Xaxis; //x轴旋转
break;
case 'y':case 'Y':
Axis = Yaxis; //y轴旋转
break;
case 'z':case 'Z':
Axis = Zaxis; //z轴旋转
break;
case 'r':case 'R' : //重置,还原为原始图
reset();
break;
case 033: //退出
case 'q':case 'Q':
exit(EXIT_SUCCESS);
break;
}
}
void printhelp()
{
std::cout << "鼠标右键为顺时针,鼠标左键为逆时针\n";
std::cout << "x/X: 沿X轴旋转\n";
std::cout << "y/Y: 沿Y轴旋转\n";
std::cout << "z/Z: 沿Z轴旋转\n";
std::cout << "r/R: 还原为初始图\n";
std::cout << "q/Q/Esc: 退出程序\n";
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); // 窗口支持双重缓冲和深度测试
glutInitWindowPosition(100, 100);
glutInitWindowSize(600, 600);
mainWindow = glutCreateWindow("欧阳炼均-2014150213-实验二");
glewExperimental = GL_TRUE;
glewInit();
init();
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
glutIdleFunc(update);
// 输出帮助信息
printhelp();
// 启用深度测试
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
OpenGL完成对OFF文件的读取和使三维模型旋转
共30个文件
tlog:6个
h:4个
glsl:2个
5星 · 超过95%的资源 需积分: 50 184 下载量 169 浏览量
2016-10-22
21:11:09
上传
评论 7
收藏 12.95MB ZIP 举报
温馨提示
本代码是通过OpenGL实行对OFF文件的读取和对读取的三维模型添加旋转功能
资源推荐
资源详情
资源评论
收起资源包目录
2014150213-欧阳炼均-实验2.zip (30个子文件)
2014150213-欧阳炼均-实验二
实验二.sln 1KB
.vs
实验二
v14
.suo 37KB
Debug
实验二.pdb 1.51MB
实验二.ilk 1.09MB
实验二.exe 132KB
实验二
实验二.vcxproj 6KB
Common
InitShader.cpp 2KB
fshader.glsl 88B
Debug
main.obj.enc 384KB
InitShader.obj 59KB
vc140.pdb 548KB
实验二.tlog
CL.write.1.tlog 1016B
实验二.lastbuildstate 193B
link.command.1.tlog 1KB
CL.read.1.tlog 53KB
CL.command.1.tlog 1KB
link.write.1.tlog 394B
link.read.1.tlog 4KB
实验二.log 2KB
main.obj 400KB
vc140.idb 835KB
vshader.glsl 166B
include
CheckError.h 1KB
vec.h 10KB
mat.h 18KB
Angel.h 2KB
cube.off 321B
main.cpp 6KB
实验二.vcxproj.filters 1KB
实验二.VC.db 31.92MB
共 30 条
- 1
Ouyang_Lianjun
- 粉丝: 2335
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页