kameraklasse funtz nicht



  • ich wollte eine kameraklasse für opengl schreiben, es sollten dort die berechnungen für die glulookat mehode durchgeführt werden.

    leider bekomme ich folgende fehlermeldungen:

    Camera.h:5: Fehler: syntax error before »Camera«
    Camera.h:6: Fehler: syntax error before »{« token
    Camera.h:29: Fehler: syntax error before »}« token
    lesson2.c:15: Fehler: syntax error before »aCamera«
    lesson2.c:15: Warnung: Datendefinition hat keinen Typ oder Speicherklasse
    lesson2.c: In Funktion »InitGL«:
    lesson2.c:31: Fehler: syntax error before »/« token
    lesson2.c: In Funktion »DrawGLScene«:
    lesson2.c:58: Fehler: syntax error before »/« token
    lesson2.c:67: Fehler: syntax error before »/« token
    lesson2.c:76: Fehler: syntax error before »/« token
    lesson2.c:76: Fehler: fehlendes abschließendes Zeichen '
    lesson2.c: In Funktion »keyPressed«:
    lesson2.c:90: Fehler: Anfrage nach Element »Move_Camera« in etwas, was keine Struktur oder Variante ist
    lesson2.c:93: Fehler: Anfrage nach Element »Move_Camera« in etwas, was keine Struktur oder Variante ist
    lesson2.c:96: Fehler: Anfrage nach Element »Rotate_View« in etwas, was keine Struktur oder Variante ist
    lesson2.c:99: Fehler: Anfrage nach Element »Rotate_View« in etwas, was keine Struktur oder Variante ist
    lesson2.c:129: Warnung: unverträgliche implizite Deklaration der eingebauten Funktion »exit«
    lesson2.c: In Funktion »main«:
    lesson2.c:150: Fehler: syntax error before »/« token
    }

    Camera.h:

    #ifndef _Camera_H_
    #define _Camera_H_
    
    class Camera
    {
    public:
    
    Camera();
    ~Camera();
    
    typedef float Vector3f[3];
    
    Vector3f eye,view,up;
    
    Vector3f addVector(Vector3f a, Vector3f b);
    
    Vector3f subVector(Vector3f a, Vector3f b);
    
    void Position_Camera(float eyeX, float eyeY, float eyeZ, float viewX, float 
     viewY, float viewZ, float upX, float upY, float upZ);
    
    void Move_Camera(float speed);
    
    void Rotate_View(float speed);
    
    };
    #endif
    

    ich kann nicht erkennen was zum teufel hier flasch sein soll.

    Camera.cpp:

    #include "Camera.h"
    
    Camera::Camera()
    
    {   
    
    }
    
    Camera::~Camera()
    
    {   
    
    }
    
    Vector3f addVector(Vector3f a, Vector3f b){
    		Vector3f c;
    		c[0] = a[0]+b[0]; c[1] = a[1]+b[1]; c[2] = a[2]+b[2];
    	return &c; 
    }
    
    Vector3f subVector(Vector3f a, Vector3f b){
    		Vector3f c;
    		c[0] = a[0]-b[0]; c[1] = a[1]-b[1]; c[2] = a[2]-b[2];
    	return &c; 
    }
    
    void Camera::Position_Camera(float eyeX,  float eyeY,  float eyeZ,
    
    			 float viewX, float viewY, float viewZ,
    
    			float upX,   float upY,   float upZ)
    
    {
    
    	eye[0]=eyeX; eye[1]=eyeY; eye[2]=eyeZ; 
    
    	view[0]=viewX; view[1]=viewY; view[2]=viewZ; 
    
    	up[0]=upX; up[1]=upY; up[2]=upZ;
    
    }
    
    // move forward: +speed, backward: -speed
    
    void Camera::Move_Camera(float speed)
    
    {
    
    	Vector3f viewVector = subVector(view,eye);
    
    	eye[0]  = eye[0]  + viewVector[0] * speed;
    
    	eye[2]  = eye[2]  + viewVector[2] * speed;
    
    	view[0] = view[0] + viewVector[0] * speed;
    
    	view[2] = view[2] + viewVector[2] * speed;
    
    }
    

    lesson2:

    #include <GL/glut.h>
    #include <GL/gl.h>
    #include <GL/glu.h>	
    #include <unistd.h>
    
    #include "lesson2.h"
    #include "Camera.h"
    
    /* ASCII code for the escape key. */
    #define ESCAPE 27
    
    static int year = 0, day = 0;
    
    Camera aCamera;
    /* The number of our GLUT window */
    int window;
    
    /* A general OpenGL initialization function.  Sets all of the initial parameters. */
    void InitGL(int Width, int Height)	       
    {
      glClearColor(0.0f, 0.0f, 0.0f, 0.0f);		
      glClearDepth(1.0);				
      glDepthFunc(GL_LESS);				
      glEnable(GL_DEPTH_TEST);			
      glShadeModel(GL_SMOOTH);			
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();				
    
      gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);	// Calculate The Aspect Ratio Of The Window
    
      glMatrixMode(GL_MODELVIEW);
    
    //
      objCamera.Position_Camera(0, 0.5f, 5,	0, 0.5f, 0,   0, 1, 0);
    }
    
    /* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */
    void ReSizeGLScene(int Width, int Height)
    {
      if (Height==0)				
        Height=1;
    
      glViewport(0, 0, Width, Height);		
    
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
    
      gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
      glMatrixMode(GL_MODELVIEW);
    }
    
    /* The main drawing function. */
    void DrawGLScene()
    {
    	  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	
      	glLoadIdentity();				// Reset The View
    
    	gluLookAt(objCamera.eye.[0],  objCamera.eye.[1],  objCamera.eye.[2],	
    
    			  objCamera.view.[0], objCamera.view.[1], objCamera.view.[2],	
    
    			  objCamera.up.[0],   objCamera.up.[1],   objCamera.up.[2]);
    
    	glColor3f (1.0, 1.0, 1.0);
    	glPushMatrix();
    //	glTranslatef (0.0, 0.0, -6.0);
    	glutWireSphere(1.0, 20, 16);   /* draw sun */
    	glRotatef ((GLfloat) year, 0.0, 1.0, 0.0);
    	glTranslatef (2.0, 0.0, 0.0);
    	glRotatef ((GLfloat) day, 0.0, 1.0, 0.0);
    	glutWireSphere(0.2, 10, 8);    /* draw smaller planet */
    	glPopMatrix();
    
    	// swap buffers to display, since we're double buffered.
    	glutSwapBuffers();
    }
    
    /* The function called whenever a key is pressed. */
    void keyPressed(unsigned char key, int x, int y) 
    {
        /* avoid thrashing this procedure */
        usleep(100);
    
    switch (key) {
    
    	case 'w':
    		aCamera.Move_Camera( 0.01f);
    		break;
    	case 's':
    		aCamera.Move_Camera( -0.01f);
    		break;
    	case 'a':
    		aCamera.Rotate_View( 0.01f);
    		break;
    	case 'd':
    		aCamera.Rotate_View( -0.01f);
    		break;
    
       case 'o':
          day = (day + 10) % 360;
          glutPostRedisplay();
          break;
       case 'O':
          day = (day - 10) % 360;
          glutPostRedisplay();
          break;
       case 'p':
          year = (year + 5) % 360;
          glutPostRedisplay();
          break;
       case 'P':
          year = (year - 5) % 360;
          glutPostRedisplay();
          break;
       default:
          break;
    }
    
        /* If escape is pressed, kill everything. */
        if (key == ESCAPE) 
        { 
    	/* shut down our window */
    	glutDestroyWindow(window); 
    
    	/* exit the program...normal termination. */
    	exit(0);                   
        }
    }
    
    int main(int argc, char **argv) 
    {  
    
      glutInit(&argc, argv);  
    
      glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);  
    
      glutInitWindowSize(640, 480);  
    
      glutInitWindowPosition(110, 0);  
    
      /* Open a window */  
      window = glutCreateWindow("Planetensystem lol");  
    
      /* Register the function to do all our OpenGL drawing. */
      glutDisplayFunc(&DrawGLScene);  
    
     // glutFullScreen();
    
      /* Even if there are no events, redraw our gl scene. */
      glutIdleFunc(&DrawGLScene);
    
      /* Register the function called when our window is resized. */
      glutReshapeFunc(&ReSizeGLScene);
    
      /* Register the function called when the keyboard is pressed. */
      glutKeyboardFunc(&keyPressed);
    
      /* Initialize our window. */
      InitGL(640, 480);
    
      /* Start Event Processing Engine */  
      glutMainLoop();  
    
      return 1;
    }
    


  • Ohne groß in den Source zu schauen, behaupte ich, dass du irgendwas in "lesson2.h" falsch gemacht hast, vielleicht ein Semikolon am Ende der Klassendefinition vergessen hast.

    Edit: Jetzt ist mir noch was anderes aufgefallen:
    Da sich dein Compiler auch über die //-Kommentare beschwert, und der Dateiname der Objektdatei ".c" ist, schließe ich darauf, dass dein Compiler den Code als C-Code interpretiert.
    Denn dort gab es weder // noch das Schlüsselwort class 😉

    Versuch entweder eine umbenennung von ".c" in ".cpp", oder sag dem Compiler manuell dass es sich um C++-Code handelt.



  • thx,

    aber leider bekomme ich neue fehlermeldungen:

    Camera.h:18: Fehler: »addVector« als Funktion, die ein Feld zurückgibt, deklariert
    Camera.h:20: Fehler: »subVector« als Funktion, die ein Feld zurückgibt, deklariert
    Camera.cpp:13: Fehler: »Vector3f« bezeichnet keinen Typ
    Camera.cpp:19: Fehler: »Vector3f« bezeichnet keinen Typ
    Camera.cpp: In member function »void Camera::Move_Camera(float)«:
    Camera.cpp:40: Fehler: ungültige Initialisierung
    Camera.cpp: In member function »void Camera::Rotate_View(float)«:
    Camera.cpp:52: Fehler: ungültige Initialisierung
    Camera.cpp:54: Fehler: Abfrage des Elementes »z« in »((Camera*)this)->Camera::view«, das vom Nicht-Klassentyp »float [3]« ist
    Camera.cpp:54: Fehler: »mPos« wurde in diesem Gültigkeitsbereich nicht definiert
    Camera.cpp:54: Fehler: »vVector« wurde in diesem Gültigkeitsbereich nicht definiert
    Camera.cpp:55: Fehler: Abfrage des Elementes »x« in »((Camera*)this)->Camera::view«, das vom Nicht-Klassentyp »float [3]« ist
    Camera.h:18: Fehler: »addVector« als Funktion, die ein Feld zurückgibt, deklariert
    Camera.h:20: Fehler: »subVector« als Funktion, die ein Feld zurückgibt, deklariert



  • typedef float Vector3f[3];
    

    Dieses typedef sieht für mich ziemlich komisch aus, und die Fehlermeldungen resultieren meiner Meinung nach daraus.

    Ich würde es einfach durch eine kleine vector-Klasse/struct ersetzen.

    So kannst du dann auch einfach die Methoden Vektorrechnung als Operatoren implentieren.



  • jo wenns so einfach wäre, ich hab mal struct verwendet da die ganze sache auch effizient laufen soll dh. spar ich mit mal eine vektor klasse:
    camera.h:

    #ifndef _Camera_H_
    #define _Camera_H_
    
    #include<math.h>
    
    class Camera
    {
    public:
    
    Camera();
    ~Camera();
    
    struct Vector3f					
    
    {			
    
    	Vector3f() {}	
    
    	Vector3f (float a, float b, float c) 
    
    	{x = a; y = b; z = c;}
    
    	tVector3 operator+(tVector3 vVector) {return tVector3(vVector.x+x, vVector.y+y, vVector.z+z);}
    
    	tVector3 operator-(tVector3 vVector) {return tVector3(x-vVector.x, y-vVector.y, z-vVector.z);}
    
    	tVector3 operator*(float number)	 {return tVector3(x*number, y*number, z*number);}
    
    	tVector3 operator/(float number)	 {return tVector3(x/number, y/number, z/number);}
    
    	float x, y, z;						
    
    }eye,view,up;
    
    //Vector3f eye,view,up;
    /*
    typedef float Vector3f[3];
    
    Vector3f eye,view,up;
    
    Vector3f *addVector(Vector3f a, Vector3f b);
    
    Vector3f *subVector(Vector3f a, Vector3f b);
    */
    
    void Position_Camera(float eyeX, float eyeY, float eyeZ, float viewX, float 
     viewY, float viewZ, float upX, float upY, float upZ);
    
    void Move_Camera(float speed);
    
    void Rotate_View(float speed);
    
    };
    #endif
    

    Camera.h:19: Fehler: ISO-C++ verbietet Deklaration von »tVector3« ohne Typ
    Camera.h:19: Fehler: expected »;« before »operator«
    Camera.h:21: Fehler: expected ;' before »tVector3« Camera.h:21: Fehler: ISO-C++ verbietet Deklaration von »tVector3« ohne Typ Camera.h:21: Fehler: expected »;« before »operator« Camera.h:23: Fehler: expected;' before »tVector3«
    Camera.h:23: Fehler: ISO-C++ verbietet Deklaration von »tVector3« ohne Typ
    Camera.h:23: Fehler: expected »;« before »operator«
    Camera.h:25: Fehler: expected ;' before »tVector3« Camera.h:25: Fehler: ISO-C++ verbietet Deklaration von »tVector3« ohne Typ Camera.h:25: Fehler: expected »;« before »operator« Camera.h:27: Fehler: expected;' before »float«

    typedef struct in allen möglichen variatione funtzt auch net 😮



  • Wenn du die Vektor-Klasse innerhalb von der Kamera-Klasse definierst, muss es in der implentation auch Camera::Vector3f heißen...

    Vielleicht solltest du sie lieber in einem neuen Header erstellen, da man Vektoren ja doch öfter brauch...



  • ...änder trozem nix an der fehlermeldung.


Anmelden zum Antworten