资源简介
计算机图形学课程设计实验,OpenGL+VS对obj文件实现三维网格光顺操作(用拉普拉斯算法),使用OpenGL类库对三维模型进行绘制,增加采用鼠标交互方式对三维模型进行旋转、放缩、平移等操作;包含完整的代码和我的实验报告
代码片段和文件信息
/********************************************************************************
* 实验二 三维网格模型光顺
*(1)掌握Obj文件的读入;
*(2)利用给定的数据结构类,建立读入网格模型数据结构;
*(3)利用OpenGL类库,对三维模型进行绘制;
*(4)利用OpenGL类库,增加采用鼠标交互方式对三维模型进行旋转、放缩、平移等操作;
*(5)实现Laplacian方法的三维模型光顺操作,并观察三维模型光顺过程;
*********************************************************************************/
#include “stdlib.h“
#include
#include
#include
#include
#include
#include
using namespace std;
#define GLUT_WHEEL_UP 3 //定义滚轮操作
#define GLUT_WHEEL_DOWN 4
int vertexnum=0; //记录点的数量
int facenum=0; //记录面的数量
GLfloat **vertex; //存放每个顶点坐标的二维数组
int **face; //存放面顶点的二维数组
GLfloat **facenormal;//存放面的法向量的二维数组
int *adjfnum;//与每个顶点相邻的面的数量
int **adjvertex;//存放与每个顶点相邻的顶点的数组
GLfloat **avevertex;//每个顶点的所有相邻顶点的平均顶点坐标的数组
GLfloat **newvertex;//通过拉普拉斯算法计算得到的新顶点
GLfloat **vertexnormal;//存放顶点法向量的二维数组
//获取点和面的数量
void GetLineNum(string addrstr)
{
ifstream infile(addrstr.c_str()); //打开指定文件
string sline;//每一行
int i = 0 j = 0;
while (getline(infile sline)&&sline.size()>0) //从指定文件逐行读取
{
if (sline[0] == ‘v‘)//点
{
vertexnum++;
}
if (sline[0] == ‘f‘)//面
{
facenum++;
}
}
}
//将文件内容读到数组中去
int ReadObj(string addrstr)
{
string s1s2;
GLfloat v1v2v3;
int f1 f2 f3;
vertex = new GLfloat*[vertexnum]; //顶点的二维数组
for (int i=0; i {
vertex[i] = new GLfloat[3];
}
face = new int*[facenum]; //面的二维数组
for (int i=0; i {
face[i] = new int[3];
}
ifstream infile(addrstr.c_str());//打开指定文件
string sline;//每一行
int jj = 0 kk = 0;
while(getline(infilesline)&&sline.size()>0) //逐行读取
{
if(sline[0]==‘v‘) //存储点
{
istringstream sin(sline);
sin>>s1>>v1>>v2>>v3;
vertex[jj][0]=v1;
vertex[jj][1]=v2;
vertex[jj][2]=v3;
jj++;
}
if (sline[0]==‘f‘) //存储面
{
istringstream sin(sline);
sin >> s2 >> f1 >> f2 >> f3;
face[kk][0] = f1;
face[kk][1] = f2;
face[kk][2] = f3;
kk++;
}
}
return 0;
}
//计算面的法向量
void GetFaceNormal()
{
facenormal = new GLfloat*[facenum]; //面的法线数组
for (int i=0; i {
facenormal[i] = new GLfloat[3];
}
for (int i=0; i {
GLfloat axayazbxbybz; //面上的两个向量(axayaz)(bxbybz)
GLfloat cxcycz; //面的法向量(cxcycz)
ax = vertex[face[i][0]-1][0] - vertex[face[i][2]-1][0];
ay = vertex[face[i][0]-1][1] - vertex[face[i][2]-1][1];
az = vertex[face[i][0]-1][2] - vertex[face[i][2]-1][2];
bx = vertex[face[i][1]-1][0] - vertex[face[i][2]-1][0];
by = vertex[face[i][1]-1][1] - vertex[face[i][2]-1][1];
bz = vertex[face[i][1]-1][2] - vertex[face[i][2]-1][2];
//(axayaz)(bxbybz)叉乘得到面的法向量(cxcycz)
cx = ay*bz - az*by;
cy = az*bx - ax*bz;
cz = ax*by - ay*bx;
//将法向量归一化
GLfloat len1 = (GLfloat)(sqrt(cx*cx + c
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2019-04-12 19:16 opengl实现三维模型光顺(Laplacian算法)\
文件 9940 2019-04-12 19:16 opengl实现三维模型光顺(Laplacian算法)\mesh.cpp
文件 196185 2019-04-12 19:16 opengl实现三维模型光顺(Laplacian算法)\实验报告.docx
- 上一篇:社工库网站程序
- 下一篇:网络工程 综合布线课程设计报告
相关资源
- opengl——爆炸
- vs2010 ffmpeg实时解码h264码流
- 志诚 VS.T591_V1.1 升级软件 程序 USB 花屏
- OpenGL三维地形建模
- FFmpeg 采集摄像头输出rtmp直播流媒体,
- 应用程序无法正常启动0xc0150002
- opengl游戏编程徐明亮版(含源码)
- 用OPENGL画的一个简单的直升飞机
- opengl完美天空盒
- FFmpeg-3.1 windows vs2013编译动态库静态库
- 3D绘图程序设计:使用Direct3D 10/9和Ope
- OpenGL绘制可运动自行车源程序.zip
- OpenGL实现飘动效果
- 个人银行账户管理系统
- vs2012调试ffmpeg.c
- opengl室内场景的绘制,包括碰撞检测
- CMake-3.9.0
- 使用ffmpeg将多张图片生成H264裸流并获
- ffmpeg-vs2013
- 基于FFMPEG_SDL2_音视频播放_参考音频时
- OpenGL场景漫游
- VS开发进阶源码---烟花特效的生日祝福
- G-code-Interpreter,G代码解释器
- 用opengl实现的太阳系模型
- OpenGL 3D贪吃蛇程序,很小
- OpenGL爆炸碎片化效果 源码
- rtmpdump vs2005版本
- OpenGL三茶壶三光源光源绕着茶壶旋转
- 10个OpenGL的源码
- Visual.Studio程序员箴言.pdf
评论
共有 条评论