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); }; #endifich 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); }; #endifCamera.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.