【发布时间】:2013-04-03 13:19:22
【问题描述】:
我一直在尝试将 3d 模型格式加载到 C++ 中,但遇到了问题。一切都很好,除了短裤的索引数组......当我尝试加载一个模型时,数组中的前两个空格是不正确的......如果我加载第二个模型;更多的短裤在模型数据中是错误的......
这是我的头文件:
#ifndef MODELDATA_H
#define MODELDATA_H
#include <GL/glu.h>
#include <string>
using namespace std;
class modelData
{
public:
modelData();
virtual ~modelData();
short m_vert_count;
short m_ind_count;
short m_tid;
GLfloat *m_verts;
GLfloat *m_tex;
GLint *m_ind;
void loadModel(string input);
void draw();
protected:
private:
};
#endif // MODELDATA_H
这是我的 cpp 文件:
#include "modelData.h"
#include <GL/glu.h>
#include <fstream>
#include <string.h>
#include <iostream>
using namespace std;
modelData::modelData()
{
//ctor
m_verts = NULL;
m_tex = NULL;
m_ind = NULL;
m_ind_count = 0;
m_vert_count = 0;
}
modelData::~modelData()
{
//dtor
delete[] m_verts;
delete[] m_tex;
delete[] m_ind;
m_ind_count = 0;
m_vert_count = 0;
}
void modelData::loadModel(string input)
{
short temp;
char *newInput = new char[input.size()+1];
newInput[input.size()]=0;
memcpy(newInput,input.c_str(),input.size());
ifstream a_file( newInput, ios::binary | ios::in );
delete newInput;
a_file.seekg( 0, ios::beg );
if ( ! a_file.read( reinterpret_cast<char*>( & m_vert_count ), sizeof( short ) ) )
{
cout << "Error reading from file: can't attain vertex buffer size" << endl;
return;
}
if ( ! a_file.read( reinterpret_cast<char*>( & m_ind_count ), sizeof( short ) ) )
{
cout << "Error reading from file: can't attain index buffer size" << endl;
return;
}
m_verts = new GLfloat[m_vert_count];
m_ind = new GLint[m_ind_count];
m_tex = new GLfloat[m_vert_count];
for (int i = 0; i < m_vert_count; i++)
{
if ( ! a_file.read( reinterpret_cast<char*>( & m_verts[i] ), sizeof( float ) ) )
{
cout << "Error reading from file: can't attain vertex buffer" << endl;
return;
}
}
for (int i = 0; i < ((m_vert_count)/3)*2; i++)
{
if ( ! a_file.read( reinterpret_cast<char*>( & m_tex[i] ), sizeof( float ) ) )
{
cout << "Error reading from file: can't attain texcoord buffer" << endl;
return;
}
}
for (int i = 0; i < m_ind_count; i++)
{
if ( ! a_file.read( reinterpret_cast<char*>( & m_ind[i] ), sizeof( short ) ) )
{
cout << "Error reading from file: can't attain index buffer" << endl;
return;
}
}
cout << m_vert_count << " " << m_ind_count << endl;
cout << "Model successfully loaded from " << input << " ...Jolly good." << endl;
}
void modelData::draw()
{
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,0,m_verts);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2,GL_FLOAT,0,m_tex);
glDrawElements(GL_TRIANGLES,m_ind_count,GL_UNSIGNED_INT,m_ind);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}
我希望代码不要太长或太乱,我真的不知道发生了什么……据我所知; m_verts[] 和 m_tex[] 看起来填充得很好,但是 m_ind[] 不断地通过数组弹出错误的数字......我是否错误地分配了数组?我没有清理我应该清理的东西吗?
哦,我不认为这是导致问题的原因,但您会注意到我没有添加任何东西来进行大端或小端转换......这是因为我使用的是英特尔机器,看起来总是假设 little endian 而我的 android 游戏引擎使用 little endian...所以我认为这不是问题...
任何帮助或建议都会很棒。 感谢阅读。
【问题讨论】:
-
GLint的大小是否与short相同?为什么使用sizeof( short )为什么不使用sizeof( GLint)? -
这不能回答你的问题,但在
loadModel中,整个newInput应该替换为ifstream a_file( input.c_str(), ios::binary | ios::in );(或者,在 C++11 中,ifstream a_file( input, ios::binary | ios::in );)。 -
请将您自己(和我们)从手动内存管理中解放出来,使用
std::vector或标准库中更合适的方式,并遵守三/五规则(_you have many potential memory leaks and double有删减)。此外,将您自己(和我们)从头文件中的全局 using 指令中解放出来。即,在尝试做更高级的事情之前,先找一本讲授惯用 C++ 的好 C++ 书籍。 -
@stardust_ 实际上该格式使用短裤,但您和 Angew 的 cmets 提供了帮助,因为这被证明是问题所在......我刚刚将 short 转换为 GLint,现在代码运行良好。
标签: c++ pointers binary fstream short