obj. Loader C++

luq

Grünschnabel
Hi,

versuche mich im Moment, an nem Objekt Loader.

Leider bekomme ich folgende Fehlermeldung:

"Fehler 11 error LNK1107: Ungültige oder beschädigte Datei: Lesen bei 0x18C nicht möglich. C:\Users\Luki89\Documents\Digitale Medien\Projekts\Programming\VisualStudios\ObjectLoader\ObjectLoader\cube.obj 1 1 ObjectLoader"

Die Wahrscheinlichkeit, dass die Datei tatsächlich beschädigt ist, halte ich für relativ gering.
Habe auch versucht, verschiedene Dateien einzulesen, jedoch erhalte ich immer die gleiche Fehlermeldung.

Mit Google und Co komm ich leider auch nicht vorran :/

Hoffe einer von euch weiß Rat.

Meine Projektmappe findet ihr hier:

http://dl.dropbox.com/u/47169014/ObjectLoader.rar


*Edit Code Ausschnit hinzugefügt

Code:
////////////////////////////////////////////////////////////////////////
// Projekt  : Aufgabe 2.1-2.5:  Datum: 16.04.2012  //
// Autor    : Lukas Sauer                                             //
//                                                                    //
////////////////////////////////////////////////////////////////////////



#include <windows.h>
#include <stdlib.h>
#include <glut.h>
#include <stdio.h>



#include <GL/gl.h>
#include <GL/glu.h>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
#include <fstream>
#include <cstdio>
#include <iostream>


struct coordinate{
	float x, y, z; 
	coordinate(float a, float b, float c) : x(a), y(b), z(c) {}; 
}; 


struct face{
	int facenum; 
	bool four; 
	int faces[4]; 
	face(int facen, int f1, int f2, int f3) : facenum(facen){
		faces[0]=f1; 
		faces[1]=f2; 
		faces[2]=f3;
		four=false; 
	}
	face(int facen, int f1, int f2, int f3, int f4) : facenum(facen){
	faces[0]=f1; 
	faces[1]=f2; 
	faces[2]=f3;
	faces[3]=f4;
	four=true; 
	}
}; 



float angle = 0.0; 

int loadObject(const char* filename)
{
	std::vector<std::string*> coord; 
	std::vector<coordinate*> vertex; 
	std::vector<face*> faces; 
	std::vector<coordinate*> normals; 
	std::ifstream in(filename); 
	if(!in.is_open())
	{
		std::cout << "Not open" << std::endl; 
		return -1; 
	}


	char buf[256]; 
	while(!in.eof())
	{
		in.getline(buf, 256); 
		coord.push_back(new  std::string(buf));
	}
	for(int i = 0; i < coord.size(); i++)
	{
		if((*coord[i])[0]=='#')
			continue; 
		else if((*coord[i])[0] =='v' && (*coord[i])[1] == ' ' )
		{			
			float tmpx, tmpy, tmpz; 
			sscanf(coord[i]->c_str(), "v %f %f %f",&tmpx, &tmpy, &tmpz); 
			vertex.push_back(new coordinate(tmpx, tmpy, tmpz)); 
		}
		else if((*coord[i])[0] =='v' && (*coord[i])[1] =='n' )
		{
			float tmpx, tmpy, tmpz;
			sscanf(coord[i]->c_str(), "vn %f %f %f",&tmpx, &tmpy, &tmpz);
			normals.push_back(new coordinate(tmpx, tmpy, tmpz)); 
		}else if((*coord[i])[0]=='f')
		{
			int a, b, c, d, e; 
			
			if(count(coord[i]->begin(), coord[i]->end(),' ') ==4)
			{
				sscanf(coord[i]->c_str(), "f %d//%d %d//%d %d//%d %d//%d",&a, &b, &c, &b, &d, &b, &e, &b); 
				faces.push_back(new face(b, a, c, d, e)); 
			}else
			{
				sscanf(coord[i]->c_str(), "f %d//%d %d//%d %d//%d",&a, &b, &c, &b, &d, &b); 
				faces.push_back(new face(b, a, c, d)); 
			}
		/*
			if(count(coord[i]->begin(), coord[i]->end(),' ') ==4)
			{
				sscanf(coord[i]->c_str(), "f %d %d %d %d %d %d %d %d",&a, &b, &c, &b, &d, &b, &e, &b); 
				faces.push_back(new face(b, a, c, d, e)); 
			}else
			{
				sscanf(coord[i]->c_str(), "f %d %d %d %d %d %d",&a, &b, &c, &b, &d, &b); 
				faces.push_back(new face(b, a, c, d)); 
			}
			*/
		}

	}

	//draw

	int num; 
	num = glGenLists(1);
	glNewList(num, GL_COMPILE); 
	for(int i = 0; i < faces.size(); i++)
	{
		if(faces[i]->four)
		{
			glBegin(GL_QUADS); 

				glNormal3f(normals[faces[i]->facenum-1]->x,
					normals[faces[i]->facenum-1]->y,
					normals[faces[i]->facenum-1]->z);
				glVertex3f(vertex[faces[i]->faces[0]-1]->x, 
					vertex[faces[i]->faces[0]-1]->y, 
					vertex[faces[i]->faces[0]-1]->z);  

				glVertex3f(vertex[faces[i]->faces[1]-1]->x, 
					vertex[faces[i]->faces[1]-1]->y, 
					vertex[faces[i]->faces[1]-1]->z);  

				glVertex3f(vertex[faces[i]->faces[2]-1]->x, 
					vertex[faces[i]->faces[2]-1]->y, 
					vertex[faces[i]->faces[2]-1]->z);  

				glVertex3f(vertex[faces[i]->faces[3]-1]->x, 
					vertex[faces[i]->faces[3]-1]->y, 
					vertex[faces[i]->faces[3]-1]->z);  

			glEnd(); 

		}else{

			glBegin(GL_TRIANGLES); 

				glNormal3f(normals[faces[i]->facenum-1]->x,
					normals[faces[i]->facenum-1]->y,
					normals[faces[i]->facenum-1]->z);
				glVertex3f(vertex[faces[i]->faces[0]-1]->x, 
					vertex[faces[i]->faces[0]-1]->y, 
					vertex[faces[i]->faces[0]-1]->z);  

				glVertex3f(vertex[faces[i]->faces[1]-1]->x, 
					vertex[faces[i]->faces[1]-1]->y, 
					vertex[faces[i]->faces[1]-1]->z);  

				glVertex3f(vertex[faces[i]->faces[2]-1]->x, 
					vertex[faces[i]->faces[2]-1]->y, 
					vertex[faces[i]->faces[2]-1]->z);  			

			glEnd(); 

		}

	}

	glEndList(); 

	for(int i=0; i<coord.size();i++)	
		delete coord[i];
	
	for(int i=0; i<faces.size(); i++)
		delete faces[i];

	for(int i=0; i<normals.size();i++)	
		delete normals[i];
	
	for(int i=0; i<vertex.size(); i++)
		delete vertex[i];

	return num; 
}




int cube; 


void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glMatrixMode(GL_PROJECTION); 
   glLoadIdentity(); 
   gluPerspective(45,640.0/480.0,1.0,500.0); 
   glMatrixMode(GL_MODELVIEW); 
   glEnable(GL_DEPTH_TEST);  
   cube = loadObject("C:\Benutzer\Luki89\Desktop\test.obj"); 
 
}

void display()
{
	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
	glLoadIdentity(); 
	glTranslatef(0.0,0.0,-5.0);
	glRotatef(angle, 1.0, 1.0, 1.0); 
	glCallList(cube); 

}


void reshape (int w, int h)
{
   
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
   glMatrixMode (GL_MODELVIEW);
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
         exit(0);
         break;
   }
}

void idle( void )
{
	glutPostRedisplay();
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE| GLUT_RGB | GLUT_DEPTH);  
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init ();
   glutDisplayFunc(display); 
   glutIdleFunc( idle );
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}




Schonmal vielen Dank im Vorraus :)
 
Zuletzt bearbeitet:
Hi.

Nächstes Mal bitte das Projekt bereinigen und die ganzen Binärdateien löschen die keiner braucht.

Und du hättest ruhig dazusagen können das du mit Objekt Datei eine Datei von Blender meinst.

Anscheinend versuchst du die cube.obj Datei mit in dein Programm zu linken - das kann nicht funktionieren.

Wir hatten hier neulich schon mal ein Thema wo es um das Laden von Blender Objektdateien ging. :google:

Gruß
 
Hey Danke für die Antwort :)

Wusste nicht, dass es von Relevanz ist, ob die Datei von Blender erstellt wird oder von einem anderen Programm.
Leider komm ich mit der Forensuche nicht weiter :/
Und könntest du mir vllt erklären, warum das mit dem "linken" nicht geht?
 
Nur, weil der Dateiname mit .obj aufhört, weiß man noch nichts über den Inhalt.

Blender speichert sein zeug in obj - gut.
Dein C++-Compiler erzeugt/arbeitet aber auch mit obj-Dateien.
Die enthalten kein 3D-Etwas, sondern einen Programmteil.

Wie soll das zusammenpassen?
 
Moin,

also hab die oben angeführt Fehlermeldung beheben können, indem ich die beiden obj. Dateien einfach aus der Projektmappe gelöscht haben, allerdings löst das immer noch nicht all meine Probleme :(

Und zwar, springt er nun von vorneherein in die Zeile 63 und gibt folgendes aus:

std::cout << "Not open" << std::endl;

Heißt natürlich, dass er die Datei an der angegebenen Stelle nicht finden kann. Habs natürlcich sowohl mit dem relativen Pfad als auch mit dem absoluten versucht, leider ohne Erfolg.
Liegt das nun an der Datei selber? Weil dann müsste es ja, wenn ich die Informationen in einer Textdatei abspeicher funktionieren.

Vielen Dank für dem Link zu dem anderen Thread, allerdings ist CodeCrafterCpp schon einen Schritt weiter als ich.


Mit freundlichem Gruß
Luq
 
ifstream kann mit jeder Art Datei umgehen, egal ob Text oder Blender.
Dein Pfad allerdings...

C:\Benutzer\Luki89\Desktop\test.obj
\ mit einem Buchstaben danach hat spezielle Bedeutungen,
zB. "\n" ist ein Zeilenwechsel.
Bei dir könnte es \b \l \d und \t rauslesen (min. zwei davon haben auch eine Bedeutung)
die entsprechenden Buchstaben selber fehlen dafür im String.

Um wirklich ein \ statt Steuerzeichen zu haben, mach doppelte \\
C:\\Benutzer\\Luki89\\Desktop\\test.obj

Das ist übrigens in C/C++ generell so, nicht nur bei ifstreams.
Egal ob Dateipfad, Konsolenausgabe etc.etc.
 
Danke Sheel :)

Dummer Fehler, hätt ich eigentlich wissen müssen :/

Nun bekomm ich folgende Error Meldung

http://dl.dropbox.com/u/47169014/error.JPG

Und der Debugger springt an folgende Stelle:

Code:
_STD_BEGIN

#ifdef _DEBUG
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Debug_message(const wchar_t *message, const wchar_t *file, unsigned int line)
	{	// report error and die
        if(::_CrtDbgReportW(_CRT_ASSERT, file, line, NULL, message)==1)
        {
            ::_CrtDbgBreak();
        }
	}
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _Debug_message(const unsigned short *message, const unsigned short *file, unsigned int line)
	{	// report error and die
        _Debug_message((wchar_t *) message, (wchar_t *) file, line);
	}

#endif

_STD_END

Kann damit jmd was anfangen? :/
 
Nur damit eher nicht.
Backtrace wäre hilfreich
(_Debug_message wurde von Funktion x aufgerufen, x von y, y von main...sowas in der Art)

Bilder etc. kannst du übrigens direkt ins Forum einbinden
("Erweitert" beim Antworten, dann Büroklmmersymbol)
 
Hi.

Stell doch einfach deinen Code hier rein. Hab gerade den Code im 1. Beitrag entdeckt.

Aus der Erinnerung prüfst du nicht ob du wirklich etwas eingelesen hast. Du verwendest soetwas wie "while (!stream.eof())" was nicht funktioniert.

Wenn der Debugger schon anhält. Geh einfach im Aufrufstack (Debug->Fenster->Aufrufstack) solange zurück bis du in deinem Code angekommen bist. Da ist dann der Fehler. Hier hast du anscheinend soetwas versucht wie:
C++:
string s = "123";

s[5] ; // Zugriffsfehler

In deinem Fall:
C++:
if ((*coord[i])[0]=='#')
Was ist, wenn die Zeile leer ist?

Und warum verwendest du denn da soviel Zeiger? Das ist nicht notwendig.

Gruß
 
Zuletzt bearbeitet:
Zurück