Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define GLFW_DLL
- #include <GLFW/glfw3.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <math.h>
- #include <iostream>
- //#include <glm\glm.hpp>
- using namespace std;
- #include "vec3.hpp"
- static double alpha_ = 0;
- static double beta_ = 0;
- static double gamma_= 0;
- static double delta_ = 0;
- static double epsilon_ = 0;
- static double zetta_ = 0;
- static double bla_ = 0;
- static double dt_ = 1;
- static double angleXAxis_=20;
- static double angleYAxis_=45;
- static double angleZAxis_=0;
- static double posX_=0;
- static double posY_=0;
- static double posZ_=0;
- static double posX2_=0;
- static double posY2_=0;
- static double posZ2_=0;
- static Vec3 e1(1,0,0);
- static Vec3 e2(0,1,0);
- static Vec3 e3(0,0,1);
- static Vec3 KAX_(1,0,0);
- static Vec3 KAY_(0,1,0);
- static Vec3 KAZ_(0,0,1);
- static Vec3 mouseSpeed(0,0,0);
- static double window_width_ = 1000;
- static double window_height_ =1000;
- double speed=1;
- double getDistanceToLine(Vec3 normale, Vec3 punkt, double verschiebung){
- return abs((normale/normale.Length())*punkt-verschiebung);
- }
- double getAngle2D(double Ax, double Ay, double Bx, double By){
- return atan2(Ay,Ax)-atan2(By,Bx)/M_PI*180;
- }
- Vec3 rotationUmVector(Vec3 N,double alpha){
- Vec3 result(0,0,0);
- return result;
- }
- Vec3 spiegelungUrsprungsgerade(double alpha, Vec3 V){
- Vec3 result(0,0,0);
- result.p[0]=V.p[0]*cos(2*alpha)+V.p[2]*sin(2*alpha);
- result.p[2]=V.p[0]*sin(2*alpha)+V.p[2]*(-cos(2*alpha));
- return result;
- }
- Vec3 spiegelungUmNomrale(Vec3 V,Vec3 A){
- Vec3 result = V-2*((A*V)/(A*A))*A;
- return result;
- }
- void SetMaterialColor(int side, double r, double g, double b) {
- float amb[4], dif[4], spe[4];
- int mat;
- dif[0] = r;
- dif[1] = g;
- dif[2] = b;
- for(int i = 0; i < 3; i++) {
- amb[i] = .1 * dif[i];
- spe[i] = .5;
- }
- amb[3] = dif[3] = spe[3] = 1.0;
- switch(side){
- case 1: mat = GL_FRONT;
- break;
- case 2: mat = GL_BACK;
- break;
- default: mat = GL_FRONT_AND_BACK;
- }
- glMaterialfv(mat, GL_AMBIENT, amb);
- glMaterialfv(mat, GL_DIFFUSE, dif);
- glMaterialfv(mat, GL_SPECULAR, spe);
- glMaterialf( mat, GL_SHININESS, 20);
- }
- // draw a sphere composed of triangles
- void DrawSphere(const Vec3& ctr, double r){
- int i, j,
- n1 = 20, n2 = 60;
- Vec3 normal, v1;
- double a1, a1d = M_PI / n1,
- a2, a2d = M_PI / n2,
- s1, s2,
- c1, c2;
- glShadeModel(GL_SMOOTH);
- for(i = 0; i < n1; i++){
- a1 = i * a1d;
- // if(i<=n1*0.5)SetMaterialColor(3,0,0,0);
- // if(i>n1*0.5)SetMaterialColor(3,1,1,1);
- glBegin(GL_TRIANGLE_STRIP);
- for(j = 0; j <= n2; j++){
- a2 = (j + .5 * (i % 2)) * 2 * a2d;
- s1 = sin(a1);
- c1 = cos(a1);
- s2 = sin(a2);
- c2 = cos(a2);
- normal = c1 * XVec3 + s1 * (c2 * YVec3 + s2 * ZVec3);
- v1 = ctr + r * normal;
- glNormal3dv(normal.p);
- glVertex3dv(v1.p);
- s1 = sin(a1 + a1d);
- c1 = cos(a1 + a1d);
- s2 = sin(a2 + a2d);
- c2 = cos(a2 + a2d);
- normal = c1 * XVec3 + s1 * (c2 * YVec3 + s2 * ZVec3);
- v1 = ctr + r * normal;
- glNormal3dv(normal.p);
- glVertex3dv(v1.p);
- }
- glEnd();
- }
- }
- // set viewport transformations and draw objects
- void InitLighting() {
- GLfloat lp1[4] = { 10, 20, 10, 0};
- GLfloat lp2[4] = { -50, 50, -10, 0};
- GLfloat lp3[4] = { -5, -50, -10, 0};
- GLfloat red[49] = {1.0, .8, .8, 1};
- GLfloat blue[4] = { .8, .8, 1.0, 1};
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glClearColor(1, 1, 1, 1);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glShadeModel(GL_SMOOTH);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
- glEnable(GL_LIGHTING);
- glLightfv(GL_LIGHT1, GL_POSITION, lp1);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, red);
- glLightfv(GL_LIGHT1, GL_SPECULAR, red);
- glEnable(GL_LIGHT1);
- glLightfv(GL_LIGHT2, GL_POSITION, lp2);
- glLightfv(GL_LIGHT2, GL_DIFFUSE, blue);
- glLightfv(GL_LIGHT2, GL_SPECULAR, blue);
- glEnable(GL_LIGHT2);
- glLightfv(GL_LIGHT2, GL_POSITION, lp3);
- glLightfv(GL_LIGHT2, GL_DIFFUSE, blue);
- glLightfv(GL_LIGHT2, GL_SPECULAR, blue);
- glEnable(GL_LIGHT3);
- glClearColor(1, 0, 0, 1);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // init viewport to canvassize
- glViewport(0, 0, window_width_, window_height_);
- // init coordinate system
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-30, 30, -30, 30, -50, 50);
- // double n=10;
- // double f=40;
- // double a=0.5;
- // double fov=90;
- // double l=-1*n*tan((a*fov)/2);
- // double r=f*tan((a*fov)/2);
- // double b=-1*n*tan(fov/2);
- // double t=f*tan(fov/2);
- //
- // glFrustum(l, r, b, t, n, f);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- void DrawQuad(Vec3 a,Vec3 b,Vec3 c,Vec3 d){
- Vec3 norm((a-b)%(a-c));
- norm=norm/norm.Length();
- glBegin(GL_QUADS);
- glNormal3dv(norm.p);
- glVertex3dv(a.p);
- glVertex3dv(b.p);
- glVertex3dv(c.p);
- glVertex3dv(d.p);
- glEnd();
- }
- void DrawTriangle(Vec3 a,Vec3 b,Vec3 c){
- Vec3 norm((a-b)%(a-c));
- norm=norm/norm.Length();
- glBegin(GL_TRIANGLES);
- glNormal3dv(norm.p);
- glVertex3dv(a.p);
- glVertex3dv(b.p);
- glVertex3dv(c.p);
- glEnd();
- }
- void DrawFancyQuad(Vec3 a,Vec3 b,Vec3 c,Vec3 d,double pro,double hoehe){
- Vec3 h(0,0,hoehe);
- Vec3 a2=((a-b)*0.1-(a-d)*0.1)+h;
- Vec3 b2=((b-c)*0.1-(b-a)*0.1)+h;
- Vec3 c2=((c-d)*0.1-(c-b)*0.1)+h;
- Vec3 d2=((d-a)*0.1-(d-c)*0.1)+h;
- DrawQuad(a,d,c,b);
- DrawQuad(a2,b2,c2,d2);
- DrawQuad(c2,b2,b,c);
- DrawQuad(d2,c2,c,d);
- DrawQuad(a2,d2,d,a);
- DrawQuad(b2,a2,a,b);
- }
- void DrawPyramidOrigami(float seitenlaenge, float angle){
- float hoehe=sqrt(seitenlaenge*seitenlaenge-(seitenlaenge/2)*(seitenlaenge/2));
- Vec3 P1(0,0,0);
- Vec3 P2(seitenlaenge,0,0);
- Vec3 P3(seitenlaenge/2,hoehe,0);
- DrawTriangle(P1,P2,P3);
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotatef(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(seitenlaenge,0,0);
- glRotated(180,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- }
- void DrawIkosaederOrigami(float seitenlaenge, float angle){
- float hoehe=sqrt(seitenlaenge*seitenlaenge-(seitenlaenge/2)*(seitenlaenge/2));
- Vec3 P1(0,0,0);
- Vec3 P2(seitenlaenge,0,0);
- Vec3 P3(seitenlaenge/2,hoehe,0);
- glTranslatef(0,-3*seitenlaenge,0);
- //glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(0,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //glPopMatrix();
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- }
- void DrawTTPOrigami(float seitenlaenge, float angle){//flächen richtig aber es muss verschiedene winkel gefaltet werden
- float hoehe=sqrt(seitenlaenge*seitenlaenge-(seitenlaenge/2)*(seitenlaenge/2));
- Vec3 P1(0,0,0);
- Vec3 P2(seitenlaenge,0,0);
- Vec3 P3(seitenlaenge/2,hoehe,0);
- //Root
- //draw tri 1
- DrawTriangle(P1,P2,P3);
- //draw group 2 3 4
- // draw 2
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- // draw 3
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- // draw 4
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- // draw 5
- glPushMatrix();
- glTranslatef(seitenlaenge,0,0);
- glRotated(180,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //draw group 6 7 8 9 10 11 12 13 14
- //draw 6
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //draw group 7 8 9 10
- //draw 7
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //draw 10
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- //draw group 8 9
- //draw 8
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //draw 9
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- glPopMatrix();
- glPopMatrix();
- glPopMatrix();
- SetMaterialColor(3,1,1,1);
- //draw group 11 12 13 14
- //draw 11
- glPushMatrix();
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //draw 12
- glTranslatef(seitenlaenge/2,hoehe,0);
- glRotated(-60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //draw 13
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- //draw 14
- glTranslatef(0,0,0);
- glRotated(60,0,0,1);
- glRotated(angle,1,0,0);
- DrawTriangle(P1,P2,P3);
- glPopMatrix();
- }
- void DrawCubeOrigami(float seitenlaenge, float angle){
- Vec3 P1(0,0,0);
- Vec3 P2(0,seitenlaenge,0);
- Vec3 P3(seitenlaenge,seitenlaenge,0);
- Vec3 P4(seitenlaenge,0,0);
- DrawQuad(P1,P2,P3,P4);
- glPushMatrix();
- glTranslatef(0,0,0);
- glRotated(90,0,0,1);
- glRotated(angle,1,0,0);
- DrawQuad(P1,P2,P3,P4);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0,seitenlaenge,0);
- glRotated(0,0,0,1);
- glRotated(angle,1,0,0);
- DrawQuad(P1,P2,P3,P4);
- glTranslatef(0,seitenlaenge,0);
- glRotated(0,0,0,1);
- glRotated(angle,1,0,0);
- DrawQuad(P1,P2,P3,P4);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(seitenlaenge,seitenlaenge,0);
- glRotated(-90,0,0,1);
- glRotated(angle,1,0,0);
- DrawQuad(P1,P2,P3,P4);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(seitenlaenge,0,0);
- glRotated(180,0,0,1);
- glRotated(angle,1,0,0);
- DrawQuad(P1,P4,P3,P4);
- glPopMatrix();
- }
- void DrawCube(double seitenlaenge){
- //Eckpunkte
- Vec3 P1(-seitenlaenge/2,seitenlaenge/2,-seitenlaenge/2);
- Vec3 P2(seitenlaenge/2,seitenlaenge/2,-seitenlaenge/2);
- Vec3 P3(seitenlaenge/2,seitenlaenge/2,seitenlaenge/2);
- Vec3 P4(-seitenlaenge/2,seitenlaenge/2,seitenlaenge/2);
- Vec3 P5(-seitenlaenge/2,-seitenlaenge/2,-seitenlaenge/2);
- Vec3 P6(seitenlaenge/2,-seitenlaenge/2,-seitenlaenge/2);
- Vec3 P7(seitenlaenge/2,-seitenlaenge/2,seitenlaenge/2);
- Vec3 P8(-seitenlaenge/2,-seitenlaenge/2,seitenlaenge/2);
- //Seiten
- DrawQuad(P1,P2,P3,P4);
- DrawQuad(P3,P2,P6,P7);
- DrawQuad(P4,P3,P7,P8);
- DrawQuad(P1,P4,P8,P5);
- DrawQuad(P2,P1,P5,P6);
- DrawQuad(P5,P6,P7,P8);
- }
- void DrawBox(double seitenlaenge){
- //Eckpunkte
- Vec3 P1(-seitenlaenge/2,seitenlaenge/2,-seitenlaenge/2);
- Vec3 P2(seitenlaenge/2,seitenlaenge/2,-seitenlaenge/2);
- Vec3 P3(seitenlaenge/2,seitenlaenge/2,seitenlaenge/2);
- Vec3 P4(-seitenlaenge/2,seitenlaenge/2,seitenlaenge/2);
- Vec3 P5(-seitenlaenge/2,-seitenlaenge/2,-seitenlaenge/2);
- Vec3 P6(seitenlaenge/2,-seitenlaenge/2,-seitenlaenge/2);
- Vec3 P7(seitenlaenge/2,-seitenlaenge/2,seitenlaenge/2);
- Vec3 P8(-seitenlaenge/2,-seitenlaenge/2,seitenlaenge/2);
- //Die 6 seiten zeichnen
- glPushMatrix();
- glTranslated(-seitenlaenge/2,seitenlaenge/2,-seitenlaenge/2);
- glRotated(beta_, 0, 0, 1);
- DrawQuad(Vec3 (0,0,0),Vec3 (0,0,seitenlaenge),Vec3 (seitenlaenge/2,0,seitenlaenge),Vec3 (seitenlaenge/2,0,0));
- glPushMatrix();
- glTranslated(seitenlaenge/2,0,0);
- glRotated(-2*beta_, 0, 0, 1);
- DrawQuad(Vec3 (0,0,0),Vec3 (0,0,seitenlaenge),Vec3 (seitenlaenge/2,0,seitenlaenge),Vec3 (seitenlaenge/2,0,0));
- glPopMatrix();
- glPopMatrix();
- DrawQuad(P3,P2,P6,P7);
- DrawQuad(P4,P3,P7,P8);
- DrawQuad(P1,P4,P8,P5);
- DrawQuad(P2,P1,P5,P6);
- DrawQuad(P5,P8,P7,P6);
- }
- void DrawZylinder(double radius,double hoehe,double res){
- int i;
- double a1=2* M_PI /res;
- Vec3 M1(0,0,0);
- Vec3 M2(0,0,hoehe);
- for(i=0; i<=res; i++){
- Vec3 P0(radius*sin(a1*(i+0)),radius*cos(a1*(i+0)),hoehe);
- Vec3 P1(radius*sin(a1*(i+0.5)),radius*cos(a1*(i+0.5)),0);
- Vec3 P2(radius*sin(a1*(i+1)),radius*cos(a1*(i+1)),hoehe);
- Vec3 P3(radius*sin(a1*(i+1.5)),radius*cos(a1*(i+1.5)),0);
- DrawTriangle(P0,P1,P2);
- DrawTriangle(P1,P2,P3);
- DrawTriangle(P0,M2,P2);
- DrawTriangle(P3,P1,M1);
- }
- }
- void DrawKrane(){
- double baseSize=2;
- double radius=1;
- double firstArmLenght=5;
- double secondArmLenght=5;
- double thirdArmLength=5;
- double greifer=3;
- glPushMatrix();
- glRotated(alpha_,0,0,1);
- DrawCube(baseSize);
- glTranslated(0,0,baseSize/2);
- glRotated(beta_,0,1,0);
- DrawSphere(Vec3(0,0,0),radius*1.2);
- DrawZylinder(radius,firstArmLenght,100);
- glTranslated(0,0,firstArmLenght);
- glRotated(gamma_,0,1,0);
- DrawSphere(Vec3(0,0,0),radius*1.2);
- DrawZylinder(radius,secondArmLenght,100);
- glTranslated(0,0,secondArmLenght);
- glRotated(delta_,0,1,0);
- DrawSphere(Vec3(0,0,0),radius*1.2);
- DrawZylinder(radius,thirdArmLength,100);
- glTranslated(-greifer/2,-0.3*sqrt(greifer*greifer-(greifer/2)*(greifer/2)),secondArmLenght);
- DrawPyramidOrigami(greifer,110);
- glPopMatrix();
- }
- bool cFCC(double seite,double punkt, double radius){
- return abs(punkt-seite/2)-radius<0;
- }
- bool cFC2D(double seitenLaenge, double radius, double px, double py){
- //test ob im x schlauch
- if(py<seitenLaenge/2&&py>-seitenLaenge/2){
- if(abs(px-seitenLaenge/2)-radius<0)return true;
- if(abs(-px-seitenLaenge/2)-radius<0)return true;
- }
- //test ob im y schlauch
- if(px<seitenLaenge/2&&px>-seitenLaenge/2){
- if(abs(py-seitenLaenge/2)-radius<0)return true;
- if(abs(-py-seitenLaenge/2)-radius<0)return true;
- }
- //testen nach Ecken
- if(px>seitenLaenge/2&&py>seitenLaenge/2&&sqrt(pow(px-seitenLaenge/2,2)+pow(py-seitenLaenge/2,2))-radius<0)return true;
- if(px>seitenLaenge/2&&py<-seitenLaenge/2&&sqrt(pow(px-seitenLaenge/2,2)+pow(-py-seitenLaenge/2,2))-radius<0)return true;
- if(px<-seitenLaenge/2&&py<-seitenLaenge/2&&sqrt(pow(-px-seitenLaenge/2,2)+pow(-py-seitenLaenge/2,2))-radius<0)return true;
- if(px<-seitenLaenge/2&&py>seitenLaenge/2&&sqrt(pow(-px-seitenLaenge/2,2)+pow(py-seitenLaenge/2,2))-radius<0)return true;
- return false;
- }
- bool cFC3D(double seitenLaenge, double radius, double posX, double posY,double posZ){
- int ccounter=0;
- if(cFC2D(seitenLaenge,radius,posX, posY))ccounter++;
- if(cFC2D(seitenLaenge,radius,posZ, posY))ccounter++;
- if(cFC2D(seitenLaenge,radius,posZ, posX))ccounter++;
- if(ccounter>=2)return true;
- return false;
- }
- double kugelrotation;
- void DrawBillardtisch(){
- double x=20+beta_;
- double z=15+alpha_;
- double h=2+delta_;
- double rb=1+gamma_;
- double kugelradius=1+epsilon_;
- double scaling=0.0001;
- double friction=1-0.0000;
- Vec3 hoehe(0,h,0);
- Vec3 P1(-x,0,z);
- Vec3 P2(x,0,z);
- Vec3 P3(x,0,-z);
- Vec3 P4(-x,0,-z);
- //Boden
- SetMaterialColor(3, 0, 0.5, 0);
- DrawQuad(P1,P2,P3,P4);
- //seiten
- SetMaterialColor(3, 0, 0.6, 0);
- DrawQuad(P1+e2*h,P2+e2*h,P2,P1);
- DrawQuad(P2+e2*h,P3+e2*h,P3,P2);
- DrawQuad(P3+e2*h,P4+e2*h,P4,P3);
- DrawQuad(P4+e2*h,P1+e2*h,P1,P4);
- //rahmen
- SetMaterialColor(3, 0.6, 0.6, 0);
- DrawQuad(P1+e2*h-e1*rb+e3*rb, P2+e2*h+e1*rb+e3*rb, P2+e2*h, P1+e2*h);
- DrawQuad(P2+e2*h+e1*rb+e3*rb, P3+e2*h+e1*rb-e3*rb, P3+e2*h, P2+e2*h);
- DrawQuad(P3+e2*h+e1*rb-e3*rb, P4+e2*h-e1*rb-e3*rb, P4+e2*h, P3+e2*h);
- DrawQuad(P4+e2*h-e1*rb-e3*rb, P1+e2*h-e1*rb+e3*rb, P1+e2*h, P4+e2*h);
- DrawQuad(P2+e2*h+e1*rb+e3*rb, P1+e2*h-e1*rb+e3*rb, P1-e1*rb+e3*rb, P2+e1*rb+e3*rb);
- DrawQuad(P3+e2*h+e1*rb-e3*rb, P2+e2*h+e1*rb+e3*rb, P2+e1*rb+e3*rb, P3+e1*rb-e3*rb);
- DrawQuad(P4+e2*h-e1*rb-e3*rb, P3+e2*h+e1*rb-e3*rb, P3+e1*rb-e3*rb, P4-e1*rb-e3*rb);
- DrawQuad(P1+e2*h-e1*rb+e3*rb, P4+e2*h-e1*rb-e3*rb, P4-e1*rb-e3*rb, P1-e1*rb+e3*rb);
- DrawQuad(P1-e1*rb+e3*rb, P2+e1*rb+e3*rb, P2, P1);
- DrawQuad(P2+e1*rb+e3*rb, P3+e1*rb-e3*rb, P3, P2);
- DrawQuad(P3+e1*rb-e3*rb, P4-e1*rb-e3*rb, P4, P3);
- DrawQuad(P4-e1*rb-e3*rb, P1-e1*rb+e3*rb, P1, P4);
- Vec3 W1(-x,0,z/2);
- Vec3 W2(x,0,z/2);
- DrawQuad(W1,W1+e2*h,W2+e2*h,W2);
- Vec3 W3(bla_,0,-z);
- Vec3 W4(-x,0,zetta_);
- DrawQuad(W3,W3+e2*h,W4+e2*h,W4);
- Vec3 W5(x,0,z);
- Vec3 W6(-x,0,0);
- DrawQuad(W5,W5+e2*h,W6+e2*h,W6);
- Vec3 Pfeiler(x/2+posX2_,0,-z/2+posZ2_);
- double pfeilerRadius=2;
- glPushMatrix();
- glTranslated(Pfeiler.p[0],Pfeiler.p[1],Pfeiler.p[2]);
- glRotated(-90,1,0,0);
- DrawZylinder(pfeilerRadius,h,100);
- glPopMatrix();
- mouseSpeed.p[0]=mouseSpeed.p[0]*friction;
- mouseSpeed.p[2]=mouseSpeed.p[2]*friction;
- posX_+=mouseSpeed.p[0]*scaling;
- posZ_+=mouseSpeed.p[2]*scaling;
- if(abs(posX_-x)-kugelradius<0){
- mouseSpeed.p[0]=-mouseSpeed.p[0];
- }
- if(abs(-posX_-x)-kugelradius<0){
- mouseSpeed.p[0]=-mouseSpeed.p[0];
- }
- if(abs(posZ_-z)-kugelradius<0){
- mouseSpeed.p[2]=-mouseSpeed.p[2];
- }
- if(abs(-posZ_-z)-kugelradius<0){
- mouseSpeed.p[2]=-mouseSpeed.p[2];
- }
- Vec3 W1W2ORTHO((W1-W2).p[2],0,-(W1-W2).p[0]);
- if(getDistanceToLine(W1W2ORTHO,Vec3(posX_,0,posZ_),W1W2ORTHO/W1W2ORTHO.Length()*W1)<=0){
- //mouseSpeed=spiegelungUrsprungsgerade(getAngle2D((W1-W2).p[0],(W1-W2).p[2],1,0),mouseSpeed);
- mouseSpeed=spiegelungUmNomrale(mouseSpeed,W1W2ORTHO);
- }
- Vec3 W3W4ORTHO((W3-W4).p[2],0,-(W3-W4).p[0]);
- if(getDistanceToLine(W3W4ORTHO,Vec3(posX_,0,posZ_),W3W4ORTHO/W3W4ORTHO.Length()*W3)<=0){
- //mouseSpeed=spiegelungUrsprungsgerade(getAngle2D((W3-W4).p[0],(W3-W4).p[2],1,0),mouseSpeed);
- mouseSpeed=spiegelungUmNomrale(mouseSpeed,W3W4ORTHO);
- }
- Vec3 W5W6ORTHO((W5-W6).p[2],0,-(W5-W6).p[0]);
- if(getDistanceToLine(W5W6ORTHO,Vec3(posX_,0,posZ_),W5W6ORTHO/W5W6ORTHO.Length()*W5)<=0){
- //mouseSpeed=spiegelungUrsprungsgerade(getAngle2D((W5-W6).p[0],(W5-W6).p[2],1,0),mouseSpeed);
- mouseSpeed=spiegelungUmNomrale(mouseSpeed,W5W6ORTHO);
- }
- if((Pfeiler-Vec3(posX_,0,posZ_)).Length()-kugelradius-pfeilerRadius<=0){
- mouseSpeed=spiegelungUrsprungsgerade(getAngle2D(-(Pfeiler-Vec3(posX_,0,posZ_)).p[2],(Pfeiler-Vec3(posX_,0,posZ_)).p[0],1,0),mouseSpeed);
- }
- glPushMatrix();
- kugelrotation+=(sqrt(pow(mouseSpeed.p[0],2)+pow(mouseSpeed.p[2],2))/50)/(2*M_PI*kugelradius);
- glTranslated(posX_,kugelradius,posZ_);
- //glRotated(getAngleToXAxis(mouseSpeed.p[0],mouseSpeed.p[2]),0,1,0);
- glRotated(kugelrotation,mouseSpeed.p[2],0,-mouseSpeed.p[0]);
- DrawSphere(Vec3(0,0,0),kugelradius);
- glPopMatrix();
- //getAngleToXAxis(1,0);
- }
- void DrawCubeKugel(double seitenLaenge,double kugelradius){
- DrawCube(seitenLaenge);
- if(cFC3D(seitenLaenge, kugelradius, posX_, posY_,posZ_))SetMaterialColor(3, 1, 0, 0.5);
- DrawSphere(Vec3(posX_,posY_,posZ_),kugelradius);
- }
- // draw the entire scene
- void Preview() {
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity(); // Reset The Current Modelview Matrix
- glTranslated(0, 0, -30.0); // Move 10 units backwards in z,
- // since camera is at origin
- //glPushMatrix();
- glRotated(angleXAxis_,0,1,0);
- glRotated(angleYAxis_,1,0,0);
- SetMaterialColor(3, 1, 0.5, 0);
- DrawKrane();
- //DrawBillardtisch();
- //DrawZylinder(10,10,100);
- //DrawCubeKugel(5,2);
- glPopMatrix();
- }
- void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
- {
- if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS){
- double xpos, ypos;
- glfwGetCursorPos(window, &xpos, &ypos);
- mouseSpeed.p[0] = xpos;
- mouseSpeed.p[2] = ypos;
- }
- if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_RELEASE){
- double xpos, ypos;
- glfwGetCursorPos(window, &xpos, &ypos);
- mouseSpeed.p[0] = xpos - mouseSpeed.p[0];
- mouseSpeed.p[2] = ypos - mouseSpeed.p[2];
- // cout << mouseSpeed.p[0] << endl << mouseSpeed.p[2] << endl;
- //
- // SpherePos.p[0] = mouseSpeed.p[0];
- // SpherePos.p[2] = mouseSpeed.p[2];
- }
- }
- void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
- {
- if (key == GLFW_KEY_N)dt_+=0.1;
- if (key == GLFW_KEY_M)dt_-=0.1;
- if (key == GLFW_KEY_UP)angleYAxis_+=dt_;
- if (key == GLFW_KEY_DOWN)angleYAxis_-=dt_;
- if (key == GLFW_KEY_LEFT)angleXAxis_+=dt_;
- if (key == GLFW_KEY_RIGHT)angleXAxis_-=dt_;
- if (key == GLFW_KEY_W)posZ2_+=dt_;
- if (key == GLFW_KEY_S)posZ2_-=dt_;
- if (key == GLFW_KEY_A)posX2_-=dt_;
- if (key == GLFW_KEY_D)posX2_+=dt_;
- if (key == GLFW_KEY_Q)posY2_+=dt_;
- if (key == GLFW_KEY_E)posY2_-=dt_;
- if (key == GLFW_KEY_1)alpha_+=dt_;
- if (key == GLFW_KEY_2)alpha_-=dt_;
- if (key == GLFW_KEY_3)beta_+=dt_;
- if (key == GLFW_KEY_4)beta_-=dt_;
- if (key == GLFW_KEY_5)gamma_+=dt_;
- if (key == GLFW_KEY_6)gamma_-=dt_;
- if (key == GLFW_KEY_7)delta_+=dt_;
- if (key == GLFW_KEY_8)delta_-=dt_;
- if (key == GLFW_KEY_9)epsilon_+=dt_;
- if (key == GLFW_KEY_0)epsilon_-=dt_;
- if (key == GLFW_KEY_B)zetta_+=0.10;
- if (key == GLFW_KEY_V)zetta_-=0.10;
- if (key == GLFW_KEY_F)bla_+=0.1;
- if (key == GLFW_KEY_G)bla_-=0.1;
- if (key == GLFW_KEY_O){
- // if(beta_<90)beta_ +=1;
- beta_ +=1;
- }
- if (key == GLFW_KEY_C){
- // if(beta_>0)beta_ -=5;
- beta_ -=1;
- }
- if (key == GLFW_KEY_R){
- alpha_=0;
- beta_ =0;
- gamma_=0;
- delta_=0;
- epsilon_=0;
- zetta_=0;
- angleXAxis_=20;
- angleYAxis_=45;
- posX_=0;
- posY_=0;
- posZ_=0;
- dt_=1;
- alpha_=0;
- }
- if(key == GLFW_KEY_ESCAPE)exit(0);
- }
- int main() {
- GLFWwindow* window = NULL;
- printf("Here we go!\n");
- if(!glfwInit()){
- return -1;
- }
- window = glfwCreateWindow(window_width_, window_height_,
- "Simple 3D Animation", NULL, NULL);
- if(!window) {
- glfwTerminate();
- return -1;
- }
- glfwMakeContextCurrent(window);
- while(!glfwWindowShouldClose(window)) {
- // switch on lighting (or you don't see anything)
- InitLighting();
- // set background color
- glClearColor(0.8, 0.8, 0.8, 1.0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- //KeyFunctions
- glfwSetMouseButtonCallback(window, mouse_button_callback);
- glfwSetKeyCallback(window, key_callback);
- // draw the scene
- Preview();
- // make it appear (before this, it's hidden in the rear buffer)
- glfwSwapBuffers(window);
- glfwPollEvents();
- }
- glfwTerminate();
- printf("Goodbye!\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment