资源简介
计算机图形学课程设计实验,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
- 上一篇:社工库网站程序
- 下一篇:网络工程 综合布线课程设计报告
相关资源
- rdlc报表 完整
- vspd7.2.308.zip
- CVSNT 完整覆盖版防TortoiseCVS中文乱码
- OpenGL参考手册
- VisualStudioUninstaller vs卸载工具
- vSphere6.06.56.7通用版注册机
- ado数据库MFC图书管理系统vs2010
- Qt Creator opengl实现四元数鼠标控制轨迹
- OpenGL文档,api大全,可直接查询函数
- opengl轮廓字体源代码
- MFC读三维模型obj文件
- 利用OpenGL写毛笔字算法
- MFC中OpenGL面和体的绘制以及动画效果
- 基于OPENGL的光线跟踪源代码368758
- VC 实现三维旋转(源码)
- vs2005骑士巡游问题-分治法C
- 自编用openGL实现3D分形树,分形山
- OpenGL球形贴图自旋程序
- OpenGL导入贴图的Texture类
- 计算机图形学(openGL)代码
- 用OpenGL开发的机械臂运动仿真程序(
- OpenGL-3D坦克模拟
-
解决安装vs2012后vs2010 li
nk : fatal er - VMware vSphere 的 Intel 82579LM网卡驱动 最
- VisualSVN-VS2019V7.0解除时间限制
- OPENGL实现世界上最小的3D游戏
- librdkafka win7 64位 vs2015编译Release版本
- VS1053B编解码器的VDR分布式声音采集卡
- VS六种配色方案(工具-导入和导出设
- VS2012OpenGL配置所需要的全部libdllh文件
评论
共有 条评论