Код opengl для отображения графики человеческого тела, чтения вершин из двоичного файла
У меня есть двоичный файл, который содержит вершины и нормали для создания графики человеческого тела в opengl. Графика состоит из маленьких треугольников. Числа (числа с плавающей запятой) в двоичных файлах имеют порядок, X, Y, Z первой вершины треугольника, за которым следуют нормали (x,y,z), аналогично еще два таких множества завершают треугольник.(таким образом, каждый набор из 18 плавающих чисел в двоичных файлах образует треугольник), а двоичные файлы содержат несколько тысяч таких треугольников. Я написал код opengl в форме окон в C++, чтобы отобразить графику, далее следует функция рендеринга. Я игнорирую нормали и использую только вершины
void OpenGL::RenderScene()
{
size_t file_size;
ifstream file;
file.open("male_16_do`enter code here`wn.bin",ios::binary|ios::in);
if(!file){
cout<<"Couldnt find the file"<<endl;
}
file.seekg(0,ios::end);
file_size=file.tellg();
file_size/=(sizeof(float));
file.seekg(0,ios::beg);
std::vector<float> data(file_size);
file.read(reinterpret_cast<char*>(&data[0]),file_size*sizeof(float));
for(size_t i=0;i<file_size;i++){
//cout<<fixed<<setprecision(3)<<data[i]<<endl;
}
vector<float>::iterator iter;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(1.5f,1.0f,0.0f);
for(iter=data.begin();iter!=data.end();iter++){
glBegin(GL_TRIANGLE_STRIP);
int i=0;
glColor3f(1,0.0f,0.0f);
glVertex3f( data[i], data[i+1], data[i+2]);
glColor3f(1,0.0f,0.0f);
glVertex3f(data[i+6],data[i+7], data[i+8]);
glColor3f(1,0.0f,0.0f);
glVertex3f( data[i+12],data[i+13], data[i+14]);
glEnd();
i=i+18;
}
SwapBuffers(m_hDC);
}
Код кажется правильным, но при рендеринге в окне ничего не отображается, может кто-нибудь подсказать, что здесь может быть не так? Окно просмотра установлено в соответствии с шириной и высотой окна.
1 ответ
Ваш for
цикл с iterator
выглядит подозрительно Вы используете iterator
над data
так же как i
:
Сделай это:
size_t dataLen = data.size();
for(size_t i = 0; i < dataLen; i+= 18) {
glBegin(GL_TRIANGLE_LIST); // your original code mentioned TRI_STRIP.
glColor3f(1,0.0f,0.0f);
glVertex3f( data[i], data[i+1], data[i+2]);
glColor3f(1,0.0f,0.0f);
glVertex3f(data[i+6],data[i+7], data[i+8]);
glColor3f(1,0.0f,0.0f);
glVertex3f( data[i+12],data[i+13], data[i+14]);
glEnd();
}