From 026961a7a6a10b7263f45e8af955ef2a8111af71 Mon Sep 17 00:00:00 2001 From: seba Date: Sun, 8 Jun 2008 14:09:56 +0200 Subject: [PATCH] =?UTF-8?q?Catmullromsplies=20hinzugef=C3=BCgt=20Camera=20?= =?UTF-8?q?hinzugef=C3=BCgt=20Bugfixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 +- catmullromspline.cpp | 101 ++++++++++++++++++++++++++++ catmullromspline.h | 31 +++++++++ emath_opengl.cpp | 6 ++ glcamera.cpp | 154 +++++++++++++++++++++++++++++++++++++++++++ glcamera.h | 56 ++++++++++++++++ glcolor.cpp | 4 ++ glcolor.h | 1 + glmenu/menumenu.cpp | 1 + matrix.cpp | 87 +++++++++++++----------- matrix.h | 9 +-- punkt3d.cpp | 34 ++++++++++ punkt3d.h | 10 +++ rotationsmatrix.cpp | 1 + 14 files changed, 453 insertions(+), 46 deletions(-) create mode 100644 catmullromspline.cpp create mode 100644 catmullromspline.h create mode 100644 glcamera.cpp create mode 100644 glcamera.h diff --git a/Makefile b/Makefile index c794191..c095a2f 100755 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CC = g++ AR = ar -OBJECTS = punkt3d.o punkt2d.o emath.o emath_opengl.o glcolor.o gldrawhelper.o glfontengine.o glrect.o gltexture.o matrix.o quaternion.o rotationsmatrix.o glsdlscreen.o sdlfuncs.o fpsmanager.o +OBJECTS = punkt3d.o punkt2d.o emath.o emath_opengl.o glcolor.o gldrawhelper.o glfontengine.o glrect.o gltexture.o matrix.o quaternion.o rotationsmatrix.o glsdlscreen.o sdlfuncs.o fpsmanager.o glcamera.o catmullromspline.o OBJOPT = -Wall -c `sdl-config --cflags` SUBDIRS = glgui glmenu models SUBDIROBJECTS = glgui/*.o glmenu/*.o models/*.o @@ -37,4 +37,4 @@ clean: cleansubdirs rm -f $(OBJECTS) # cd glgui; $(MAKE) clean # cd glmenu; $(MAKE) clean - @echo Done cleaning... \ No newline at end of file + @echo Done cleaning... diff --git a/catmullromspline.cpp b/catmullromspline.cpp new file mode 100644 index 0000000..0e71eda --- /dev/null +++ b/catmullromspline.cpp @@ -0,0 +1,101 @@ +#include "catmullromspline.h" + +CatmullRomSpline::CatmullRomSpline(float _s) { + cr = new Matrix(4, 4); + setS(_s); +} + +void CatmullRomSpline::makeMatrix() { + cr->set(-s , 0, 0); + cr->set( 2-s , 0, 1); + cr->set( s-2 , 0, 2); + cr->set( s , 0, 3); + + cr->set( 2*s , 1, 0); + cr->set( s-3 , 1, 1); + cr->set( 3-2*s, 1, 2); + cr->set(-s , 1, 3); + + cr->set(-s, 2, 0); + cr->set( 0, 2, 1); + cr->set( s, 2, 2); + cr->set( 0, 2, 3); + + cr->set( 0, 3, 0); + cr->set( 1, 3, 1); + cr->set( 0, 3, 2); + cr->set( 0, 3, 3); +} + +Matrix CatmullRomSpline::getPosition(float u, Matrix &controlpoints) { +// Matrix controlpoints(4, a.getN()); +// for(int i=0; i +#include +#include +#include "matrix.h" +#include "punkt2d.h" +#include "punkt3d.h" + + +class CatmullRomSpline { + private: + Matrix *cr; + float s; + + void makeMatrix(); + public: + CatmullRomSpline(float _s=0.5f); + + Matrix getPosition(float u, Matrix &controlpoints); + Punkt3D getPosition(float u, Punkt3D a, Punkt3D b, Punkt3D c, Punkt3D d); + Punkt2D getPosition(float u, Punkt2D a, Punkt2D b, Punkt2D c, Punkt2D d); + + + void setS(float _s); + ~CatmullRomSpline(); +}; + + +#endif diff --git a/emath_opengl.cpp b/emath_opengl.cpp index 53b6468..d888d02 100644 --- a/emath_opengl.cpp +++ b/emath_opengl.cpp @@ -41,6 +41,12 @@ void rotFrom2VecTo2Vec(Punkt3D a, Punkt3D b, Punkt3D c, Punkt3D d) { Punkt3D rvec, rvec2; float rvecdeg, rvecdeg2; rotFrom2VecTo2Vec(a, b, c, d, &rvec, &rvecdeg, &rvec2, &rvecdeg2); +// if(rvecdeg) glRotatef(rvecdeg, rvec); +// if(rvecdeg2) glRotatef(rvecdeg2, rvec2); +// std::cout << rvecdeg << ", " << rvecdeg2 << std::endl; +// rvec.print("rvecdeg"); +// rvec2.print("rvecdeg2"); + } diff --git a/glcamera.cpp b/glcamera.cpp new file mode 100644 index 0000000..3a28aee --- /dev/null +++ b/glcamera.cpp @@ -0,0 +1,154 @@ +#include "glcamera.h" + +GLCamera::GLCamera() { + std_norm.set(0.0f, 1.0f, 0.0f); + std_dir.set(0.0f, 0.0f, -1.0f); + mpersec = 10.0f; + apersec = 90.0f; + doupdate = true; + + norm.set(0.0f, 1.0f, 0.0f); + dir.set(0.0f, 0.0f, -1.0f); + + rotx = roty = 0.0f; + + rotmatX.set(x_axis, 0.0f); + rotmatY.set(y_axis, 0.0f); +} + +void GLCamera::updateVectors() { + dir = rotmatY * rotmatX * Punkt3D(0.0f, 0.0f, -1.0f); + norm = rotmatY * rotmatX * std_norm; + dir.normalize(); + norm.normalize(); +} + +void GLCamera::setCamera() { + + if(doupdate) { + updateVectors(); + } + Punkt3D port = pos + dir; + gluLookAt( pos.x, pos.y, pos.z, + port.x, port.y, port.z, + norm.x, norm.y, norm.z); +// rotFrom2VecTo2Vec(std_dir, dir, std_norm, norm); +// glTranslateP3D(-pos); +} + + +// Move-Funktionen + +void GLCamera::moveForward(float sec) { + if(doupdate) { + updateVectors(); + } + pos += (mpersec*sec) * dir; +// std::cout << "move.."; +// pos.print("pos"); +} + +void GLCamera::moveBackward(float sec) { + if(doupdate) { + updateVectors(); + } + pos -= (mpersec*sec) * dir; +} + +void GLCamera::moveLeft(float sec) { + if(doupdate) { + updateVectors(); + } + Punkt3D right = (dir.kreuzprodukt(norm)); + right.normalize(); + pos -= right * sec * mpersec; + +} + +void GLCamera::moveRight(float sec) { + if(doupdate) { + updateVectors(); + } + Punkt3D right = (dir.kreuzprodukt(norm)); + right.normalize(); + pos += right * sec * mpersec; + +} + +void GLCamera::rotateLeft(float sec) { + roty += apersec * sec; + rotmatY.set(roty); + doupdate = true; +// rotmat.set(Punkt3D(0.0f, 1.0f, 0.0f), sec*apersec); +// dir = rotmat * dir; +// dir.normalize(); +} + +void GLCamera::rotateRight(float sec) { + roty -= apersec * sec; + rotmatY.set(roty); + doupdate = true; +// statt norm +// rotmat.set(Punkt3D(0.0f, 1.0f, 0.0f), -apersec*sec); +// dir = rotmat * dir; +// dir.normalize(); +} + +void GLCamera::rotateUp(float sec) { + if(rotx+sec*apersec<=90.0f && rotx+sec*apersec>=-90.0f) { + rotx += sec*apersec; + rotmatX.set(rotx); + doupdate = true; + } else { + //std::cout << "zu groß" << std::endl; + } +// rotmat.set(dir.kreuzprodukt(norm), -apersec*sec); +// norm = rotmat * norm; +// dir = rotmat * dir; +// norm.normalize(); +// dir.normalize(); +} + +void GLCamera::rotateDown(float sec) { + if( (rotx-sec*apersec) >= -90.0f) { + rotx -= sec*apersec; + rotmatX.set(rotx); + doupdate = true; + } +// rotmat.set(dir.kreuzprodukt(norm), apersec*sec); +// norm = rotmat * norm; +// dir = rotmat * dir; +// norm.normalize(); +// dir.normalize(); +} + +float GLCamera::getXrot() { + return rotx; +} + +float GLCamera::getYrot() { + return roty; +} + +void GLCamera::print() { + std::cout << " --- GL Camera --- " << std::endl; + pos.print("Position"); + norm.print("Normale"); + dir.print("Direction"); + dir.kreuzprodukt(norm).print("Kreuz"); + std::cout << "Rotation X: " << rotx << " Y: " << roty << std::endl; + rotmatY.print(); + std::cout << " --- End Camera --- " << std::endl; +} + +void GLCamera::renderCoord() { + glBegin(GL_LINES); + glColor3f(0.0f, 1.0f, 0.0f); + glVertex3f(0.0f, -1.0f, 0.0f); + glVertex3f(0.0f, -1.0f, -5.0f); + glEnd(); +} + +GLCamera::~GLCamera() { + +} diff --git a/glcamera.h b/glcamera.h new file mode 100644 index 0000000..3a57183 --- /dev/null +++ b/glcamera.h @@ -0,0 +1,56 @@ +#ifndef __GLCAMERA_H +#define __GLCAMERA_H + +#include +#include +#include +#include "rotationsmatrix.h" +#include "emath_opengl.h" +#include "punkt3d.h" + +class GLCamera { + private: + Punkt3D std_dir; + Punkt3D std_norm; + + Punkt3D pos; + Punkt3D norm; + Punkt3D dir; // normalisiert + + float rotx; + float roty; + bool doupdate; + + float mpersec; + float apersec; + + Rotationsmatrix rotmatX; + Rotationsmatrix rotmatY; + + void updateVectors(); + public: + GLCamera(); +// GLCamera(Punkt3d + + void setCamera(); + + // Std Move + void moveForward(float sec); + void moveBackward(float sec); + void moveLeft(float sec); + void moveRight(float sec); + void rotateLeft(float sec); + void rotateRight(float sec); + void rotateUp(float sec); + void rotateDown(float sec); + + float getXrot(); + float getYrot(); + + void print(); + void renderCoord(); + + ~GLCamera(); +}; + +#endif diff --git a/glcolor.cpp b/glcolor.cpp index f19ab5b..ed5a8c1 100644 --- a/glcolor.cpp +++ b/glcolor.cpp @@ -5,6 +5,10 @@ GLColor::GLColor() { setalpha = true; } +GLColor::GLColor(float _r, float _g, float _b, float _a) { + set(_r, _g, _b, _a); +} + GLColor::GLColor(const SDL_Color &c) { set(c.r/255.0f, c.g/255.0f, c.b/255.0f); setalpha = true; diff --git a/glcolor.h b/glcolor.h index 27c256d..d1ad223 100644 --- a/glcolor.h +++ b/glcolor.h @@ -13,6 +13,7 @@ class GLColor { GLColor(); + GLColor(float _r, float _g, float _b, float _a=1.0f); GLColor(const SDL_Color&); void set(float _r, float _g, float _b, float _a=1.0f); diff --git a/glmenu/menumenu.cpp b/glmenu/menumenu.cpp index 415f9e8..a92538b 100644 --- a/glmenu/menumenu.cpp +++ b/glmenu/menumenu.cpp @@ -87,6 +87,7 @@ void MenuMenu::resetItemPos() { } void MenuMenu::render() { + Punkt2D pos = menupos; pos.y += offset; if(centerScreenX) { diff --git a/matrix.cpp b/matrix.cpp index f865e97..21f346c 100644 --- a/matrix.cpp +++ b/matrix.cpp @@ -56,6 +56,13 @@ bool Matrix::set(float d, int _m, int _n) { return true; } +float Matrix::get(int _m, int _n) { + if(_m>=m||_n>=n) + return 0.0f; + + return c[_m][_n]; +} + Matrix Matrix::operator*(const Matrix &d) { if(n!=d.m) @@ -83,45 +90,45 @@ Matrix& Matrix::operator=(const Matrix& mat) { return *this; } -// Matrix Matrix::operator+(const float &f) { -// Matrix tmp(*this); -// for(int i=0; i