• 大小: 185KB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-02-05
  • 语言: 其他
  • 标签: opengl  vs  

资源简介

计算机图形学课程设计实验,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

评论

共有 条评论