资源简介

自己构建的半边结构,并实现了loop细分算法,并实现了3d模型的缩放等

资源截图

代码片段和文件信息

#include “stdafx.h“
#include   
#include “GL\glut.h“
#include 
#include 
#include 
#include 
#include
#include
using namespace std;

//用于点线面的个数
int numofvertex = 0;
int numofface = 0;
int numofline = 0;
//定义窗口大小
int WIDTH = 600;
int HEIGHT = 600;
float maxx = -1;
float maxy = -1;
float maxz = -1;
float minx = 1;
float miny = 1;
float minz = 1;
//定义摄像机位置和方向
GLfloat ShootPosition[] = { 000 };
GLfloat ShootDirect[] = { 000 };
//与实现旋转角度大小相关的参数,只需要两个就可以完成
float scale = 1.0;
float px;
float py;
float theta1 = 0;
float theta2 = 0;
float radius = 0;

int displaystate = 0;
float PI = 3.1415926;

//定义点、面、边等结构
struct vertex;
struct face;
struct halfedge;
struct he_face;
struct normalVec;
struct iedge;
vertex* vertexs;
face* faces;
he_face** hefaces;
normalVec* normalvectors;
iedge** iedges;
//定义半边结构
struct halfedge {
halfedge* next;//下一条半边
halfedge* opposite;//与其相反的半边
int end;//所指的点
bool visit;//是否被访问过
he_face* face;//所属的面
//定义构造函数并初始化
halfedge() {
next = NULL;
opposite = NULL;
end = -1;
face = NULL;
visit = false;
}
};
//定义半边结构中的点结构
struct vertex {
//点坐标
float x;
float y;
float z;
//指向该点的半边
halfedge* edge;
//是否被访问过
bool visit;
//空构造函数,初始化
vertex() {
visit = false;
}
//构造函数
vertex(float a float b float c) {
x = a;
y = b;
z = c;
edge = NULL;
visit = false;
}
};
//定义正常的点的结构或者成为向量
struct normalVec {
//点坐标
float x;
float y;
float z;
normalVec() {

}
normalVec(float a float b float c) {
x = a;
y = b;
z = c;
}
};
//定义半边中面的结构
struct he_face {
//包含的半边
halfedge* edge;
//是否被访问过
bool visit;
he_face() {
edge = NULL;
visit = false;
}
};
//定义正常的面的结构
struct face {
//构成该面的点的数量
int numofv;
//构成该面的点
int* vertexs;
face() {

}
face(int nv) {
numofv = nv;
vertexs = new int[nv];
}
};
//定义自己的边结构
struct iedge {
//起点
int start;
//在loop细分中的中间点
int middle;
//所含半边(两条)
halfedge* he;
iedge* next;
iedge() {
start = -1;
he = NULL;
next = NULL;
middle = -1;
}
};

//读取3d文件,off格式 
void readFile() {
char data[100];
ifstream infile;
infile.open(“bunny.off“);
//读取“off”字符
infile >> data;
//读取点、面、边的数量
infile >> numofvertex;
infile >> numofface;
infile >> numofline;
vertexs = new vertex[numofvertex];
faces = new face[numofface];
int vnum = 0;
int fnum = 0;
//构建“点”集
while (vnum < numofvertex) {
float x;
float y;
float z;
infile >> x;
infile >> y;
infile >> z;
vertexs[vnum] = vertex(x y z);
vnum++;
}
//构建“面”集
while (fnum {
int numofv;
infile >> numofv;
face f = face(numofv);
for (int i = 0; i < numofv; i++)
{
int v;
infile >> v;
f.vertexs[i] = v;
}
faces[fnum] = f;
fnum++;
}
infile.close();
}


int getMiddle(int start int end iedge** iedges) {
iedge* temp = iedges[start];

评论

共有 条评论