#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include "plyLoader.h"
#include "glew.h"
#include "glut.h"
//extern GLuint g_texture;
CPlyLoader::CPlyLoader(char * plyFileName, unsigned int time = 1, int faceDir = 1)
{
init();
m_time = time;
m_faceDir = faceDir;
loadPly(plyFileName);
initVBO();
}
CPlyLoader::~CPlyLoader()
{
fclose(m_fp);
free(m_pVertex);
printf("%s\n",m_pVertex);
free(m_pFace);
printf("%s\n",m_pFace);
if(m_conPos > 0)
free(m_pConfidence);
if(m_intenPos > 0)
free(m_pIntensity);
}
void CPlyLoader::init()
{
m_fp = NULL;
m_time = 1;
m_vertexNum = 0;
m_pVertex = NULL;
m_faceNum = 0;
m_faceDir = 1;
m_verProNum = 3;
m_conPos = 0;
m_intenPos = 0;
m_pConfidence = NULL;
m_pIntensity = NULL;
m_VBO = 0;
}
void CPlyLoader::loadPly(char * plyFileName)
{
FILE *fp;
char tmp[20];
int anaState = 0;
if((fp = fopen(plyFileName,"rt")) == NULL)
{
printf("打开%s文件失败!\n",plyFileName);
exit(1);
}
m_fp = fp;
// 从ply文件读取第一个字符串,用于检查是否为标准ply编码
fscanf(m_fp,"%s",tmp);
if (strcmp(tmp,"ply"))
{
printf("%s不符合标准ply文件格式!\n",plyFileName);
exit(1);
}
fscanf(m_fp,"%s",tmp);
// 检查ply文件是否为ascii 1.0编码
if((fscanf(m_fp,"%s",tmp),strcmp(tmp, "ascii"))|| (fscanf(m_fp,"%s",tmp),strcmp(tmp, "1.0")))
{
printf("程序当前只支持ascii 1.0编码的ply文件!\n");
exit(1);
}
// 丢弃掉ply文件中的注释部分,此处默认注释在紧接规定格式之后的一行出现
while((fscanf(m_fp,"%s",tmp),!strcmp(tmp,"comment")))
while(fgetc(m_fp) != '\n');
// 以上循环最后一次获取的是"element"字符串
/************************************************************************/
/* 分析ply文件的头部分 */
/************************************************************************/
// 分析顶点属性
fscanf(m_fp,"%s",tmp); // 获取字符串“vertex”
fscanf(m_fp,"%s",tmp); // 获取“vertex”后的顶点数字符串
m_vertexNum = atoi(tmp);
if(m_vertexNum > 0)
m_pVertex = (t_vertex*) malloc( sizeof(t_vertex) * m_vertexNum);
printf("m_vertexNum = %d\n",m_vertexNum);
// 跳过ply文件中vertex的坐标属性
fscanf(m_fp,"%s",tmp);
while(!strcmp(tmp, "z"))
{
fscanf(m_fp,"%s",tmp);
}
// 获取vertex坐标之外的属性,程序中只分析confidence和intensity两个属性
if(!strcmp(tmp, "property")){
while((fscanf(m_fp,"%s",tmp) , strcmp(tmp, "element")))
{
if(!strcmp(tmp, "confidence"))
{
m_conPos = ++m_verProNum;
m_pConfidence = (float*) malloc( sizeof(float) * m_vertexNum);
printf("Confidence property ON!\nm_verProNum = %d\n",m_verProNum);
}
if(!strcmp(tmp, "intensity"))
{
m_intenPos = ++m_verProNum;
m_pIntensity = (float*) malloc( sizeof(float) * m_vertexNum);
printf("Intensity property ON!\nm_verProNum = %d\n",m_verProNum);
}
}
}
// 分析面属性
fscanf(m_fp,"%s",tmp); // 获取字符串“face”
fscanf(m_fp,"%s",tmp); // 获取“vertex”后的顶点数字符串
m_faceNum = atoi(tmp);
m_pFace = (t_face*) malloc(sizeof(t_face) * m_faceNum);
//m_pNormal = (t_normal*) malloc(3 * sizeof(t_normal) * m_faceNum);
printf("m_faceNum = %d\n",m_faceNum);
// 跳过face属性之后的ply文件头部分
while ((fscanf(m_fp,"%s",tmp) , strcmp(tmp, "end_header")));
// 读取顶点数据
for (int i = 0; i < m_vertexNum; i++)
{
fscanf(m_fp,"%s",tmp);
m_pVertex[i].x = atof(tmp) * m_time;
fscanf(m_fp,"%s",tmp);
m_pVertex[i].y = atof(tmp) * m_time;
fscanf(m_fp,"%s",tmp);
m_pVertex[i].z = atof(tmp) * m_time;
if(m_conPos)
{
fscanf(m_fp,"%s",tmp);
m_pConfidence[i] = atof(tmp);
}
if(m_intenPos)
{
fscanf(m_fp,"%s",tmp);
m_pIntensity[i] = atof(tmp);
}
}
// 读取面数据,并计算法向量
for (int i = 0; i < m_faceNum; i++)
{
fscanf(m_fp,"%s",tmp);
fscanf(m_fp,"%s",tmp);
m_pFace[i].vertex1 = atoi(tmp);
fscanf(m_fp,"%s",tmp);
m_pFace[i].vertex2 = atoi(tmp);
fscanf(m_fp,"%s",tmp);
m_pFace[i].vertex3 = atoi(tmp);
/*m_pNormal[3 * i].x = m_pNormal[3 * i + 1].x = m_pNormal[3 * i + 2].x= 500*((m_pVertex[m_pFace[i].vertex3].y - m_pVertex[m_pFace[i].vertex1].y) * (m_pVertex[m_pFace[i].vertex2].z - m_pVertex[m_pFace[i].vertex1].z)
- (m_pVertex[m_pFace[i].vertex3].z - m_pVertex[m_pFace[i].vertex1].z) * (m_pVertex[m_pFace[i].vertex2].y - m_pVertex[m_pFace[i].vertex1].y));
m_pNormal[3 * i].y = m_pNormal[3 * i + 1].y = m_pNormal[3 * i + 2].y = 500*((m_pVertex[m_pFace[i].vertex3].z - m_pVertex[m_pFace[i].vertex1].z) * (m_pVertex[m_pFace[i].vertex2].x - m_pVertex[m_pFace[i].vertex1].x)
- (m_pVertex[m_pFace[i].vertex3].x - m_pVertex[m_pFace[i].vertex1].x) * (m_pVertex[m_pFace[i].vertex2].z - m_pVertex[m_pFace[i].vertex1].z));
m_pNormal[3 * i].z = m_pNormal[3 * i + 1].z = m_pNormal[3 * i + 2].z = 500*((m_pVertex[m_pFace[i].vertex3].x - m_pVertex[m_pFace[i].vertex1].x) * (m_pVertex[m_pFace[i].vertex2].y - m_pVertex[m_pFace[i].vertex1].y)
- (m_pVertex[m_pFace[i].vertex3].y - m_pVertex[m_pFace[i].vertex1].y) * (m_pVertex[m_pFace[i].vertex2].x - m_pVertex[m_pFace[i].vertex1].x));*/
}
}
void CPlyLoader::display()
{
/************************************************************************/
/* 通过VBO绘制,将ply文件中的每个面的三个点都存储在以上申请的数组中,然
后将数组上载到Client */
/************************************************************************/
// Enable Pointers
glEnableClientState( GL_VERTEX_ARRAY ); // 启用顶点数组
glEnableClientState( GL_NORMAL_ARRAY );
glVertexPointer( 3, GL_FLOAT, 0, (void*)0 ); // 设置顶点格式,最后一个参数为偏移量
glNormalPointer( GL_FLOAT, 0, (void*)0 );
//glColorPointer( 3, GL_FLOAT, 0, (void*)10 );
// 绘制三角形
glDrawElements( GL_TRIANGLES, 3 * m_faceNum, GL_UNSIGNED_INT, 0);
// Disable Pointers
glDisableClientState( GL_VERTEX_ARRAY ); // 关闭顶点数组
glDisableClientState( GL_NORMAL_ARRAY ); // 关闭法向量数组
//glDisableClientState( GL_COLOR_ARRAY ); // 关闭颜色数组
}
void CPlyLoader::initVBO()
{
glGenBuffersARB( 1, &m_VBO); // 获取一个VBO标识
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_VBO ); // 绑定VBO
// 上载顶点数据
glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_vertexNum * 3 * sizeof(float), m_pVertex, GL_STATIC_DRAW_ARB );
glGenBuffersARB(1, &m_IBO);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_IBO);
// 上载面片顶点序列数组
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_faceNum * 3 * sizeof(unsigned int),m_pFace, GL_STATIC_DRAW_ARB);
//glGenBuffersARB( 1, &m_NBO);
//glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_NBO );
//// 上载法向量数据
//glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_faceNum * 3 * 3 * sizeof(float), m_pNormal, GL_STATIC_DRAW_ARB );
}
没有合适的资源?快使用搜索试试~ 我知道了~
PLY 3D模型载入程序
共37个文件
h:4个
obj:4个
pdb:4个
5星 · 超过95%的资源 需积分: 12 85 下载量 141 浏览量
2010-10-13
09:18:42
上传
评论 1
收藏 2.56MB ZIP 举报
温馨提示
自己写的一个(用于静态SSAO绘制)最基本的ply文件解析程序,功能有限,绘制过程利用了VBO,有兴趣的同学可以看看(附带斯坦福兔子ply文件)
资源推荐
资源详情
资源评论
收起资源包目录
SSAO.zip (37个子文件)
SSAO
SSAO
glut32.dll 157KB
plyLoader.cpp 7KB
SSAO.vcproj 4KB
glew32.dll 208KB
Debug
SSAO.exe.embed.manifest.res 728B
SSAO.obj 62KB
SSAO.exe.intermediate.manifest 621B
vc90.idb 195KB
BuildLog.htm 9KB
mt.dep 67B
vc90.pdb 220KB
SSAO.exe.embed.manifest 663B
plyLoader.obj 21KB
Release
SSAO.obj 483KB
SSAO.exe.intermediate.manifest 616B
vc90.idb 99KB
BuildLog.htm 21KB
mt.dep 67B
vc90.pdb 196KB
plyLoader.obj 27KB
gl
include
glut.h 21KB
glew.h 463KB
glaux.h 12KB
lib
glut32.lib 78KB
glew32.lib 275KB
data
bunny.ply 2.89MB
plyLoader.h 1KB
SSAO.vcproj.DGSong-PC.DGSong.user 1KB
SSAO.cpp 5KB
SSAO.ncb 2.14MB
Debug
SSAO.exe 49KB
SSAO.ilk 541KB
SSAO.pdb 651KB
Release
SSAO.exe 16KB
SSAO.pdb 371KB
SSAO.sln 878B
SSAO.suo 12KB
共 37 条
- 1
linscs
- 粉丝: 5
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页