Browse Source

Changed impuls and collision calculation

kolja 5 years ago
parent
commit
842e05d98b
5 changed files with 25 additions and 22 deletions
  1. 3 3
      Model2D.cpp
  2. 1 1
      Model2D.h
  3. 17 15
      Welt2D.cpp
  4. 2 1
      Welt2D.h
  5. 2 2
      Zeichnung.cpp

+ 3 - 3
Model2D.cpp

@@ -723,7 +723,7 @@ void Model2DObject::setTextur( Textur2D *t )
     t->release();
 }
 
-void Model2DObject::impuls( Vertex start, Vertex speed )
+void Model2DObject::impuls( Vertex start, Vertex speed, float strength )
 {
     start = getObjectPos( start );
     speed = getObjectDir( speed );
@@ -753,8 +753,8 @@ void Model2DObject::impuls( Vertex start, Vertex speed )
         // TODO schleife über alle polygone und translation von start und speed in Object koordinaten
         if( dist < INFINITY )
         {
-            this->speed += resSpeed;
-            this->rSpeed += resRotSpeed;
+            this->speed += resSpeed * strength;
+            this->rSpeed += resRotSpeed * strength;
         }
     }
 }

+ 1 - 1
Model2D.h

@@ -105,7 +105,7 @@ namespace Framework
         //  t: Das Bild, das als Textur verwendet werden soll
         //  polygonName: Der name des Polygons, was die Textur bekommen soll
         __declspec( dllexport ) void setTextur( Textur2D *t, const char *polygonName );
-        __declspec( dllexport ) void impuls( Vertex start, Vertex speed ) override;
+        __declspec( dllexport ) void impuls( Vertex start, Vertex speed, float strength ) override;
         // Zeichnet die Zeihnung in ein bestimmtes Bild
         //  zRObj: Das Bild, in das gezeichnet werden soll
         __declspec( dllexport ) void render( Mat3< float > &kamMat, Bild &zRObj, const char *kamName ) override;

+ 17 - 15
Welt2D.cpp

@@ -21,7 +21,7 @@ void Object2D::explosion( Vertex worldPos, float intensity )
     speed += ( position - worldPos ) * intensity;
 }
 
-void Object2D::impuls( Vertex start, Vertex speed )
+void Object2D::impuls( Vertex start, Vertex speed, float strength )
 {}
 
 void Object2D::setSpeed( Vertex speed )
@@ -85,30 +85,32 @@ void Object2D::setCollision( bool handle )
 bool Object2D::handleCollision( Object2D *obj )
 {
     Vertex hp;
-    if( istModelInnen( obj, &hp ) )
+    if( istModelInnen( obj, &hp ) ) // hp wird auf den aufprallpunkt gesetzt
     {
+        // Geschwindigkeit von diesem objekt mit rotation
         Vertex v1 = getSpeed() + getWorldDir( getObjectPos( hp ).rotation( rSpeed ) - getObjectPos( hp ) );
+        // Geschwindigkeit des anderen Objektes mit rotation
         Vertex v2 = obj->getSpeed() + getWorldDir( obj->getObjectPos( hp ).rotation( obj->getDrehungSpeed() ) - obj->getObjectPos( hp ) );
         if( ( position - obj->getPosition() ).getLengthSq() > ( position + v1 * 0.03f - obj->getPosition() - v2 * 0.03f ).getLengthSq() )
-        {
-            //float m1 = getMasse();
-            //float m2 = obj->getMasse();
-            //if( m1 == 0 || m2 == 0 )
-            //    return 0;
-            //float nm1 = m1 / ( m1 + m2 );
-            //float nm2 = m2 / ( m1 + m2 );
-            //rSpeed *= nm2;
-            //speed *= nm2;
-            //obj->setDrehungSpeed( obj->getDrehungSpeed() * nm1 );
-            //obj->setSpeed( obj->getSpeed() * nm1 );
+        { // nur wenn sie sich aufeinander zu bewegen
+            float m1 = getMasse(); // fläche von Objekt 1
+            float m2 = obj->getMasse(); // fläche von Objekt 2
+            if( m1 == 0 || m2 == 0 )
+                return 0; // falls ein objekt keine masse hat ignoriere die kollision
+            float nm1 = m1 / ( m1 + m2 ); // koeffizient für objekt 2
+            float nm2 = m2 / ( m1 + m2 ); // koeffizient für Objekt 1
+            //rSpeed *= nm2; // Drehgeschwindigkeit anpassen (objekt 1)
+            //speed *= nm2; // Bewegungsgeschwindigkeit anpassen (objekt 1)
+            //obj->setDrehungSpeed( obj->getDrehungSpeed() * nm1 ); // Drehgeschwindigkeit anpassen (objekt 2)
+            //obj->setSpeed( obj->getSpeed() * nm1 ); // Bewegungsgeschwindigkeit anpassen (objekt 2)
             rSpeed = 0;
             speed = Vertex();
             obj->setDrehungSpeed( 0 );
             obj->setSpeed( Vertex() );
             if( v2.x || v2.y )
-                impuls( hp - v2, v2 );
+                impuls( hp - v2, v2, nm2 );
             if( v1.x || v1.y )
-                obj->impuls( hp - v1, v1 );
+                obj->impuls( hp - v1, v1, nm1 );
             return 1;
         }
     }

+ 2 - 1
Welt2D.h

@@ -39,7 +39,8 @@ namespace Framework
         // Übt auf das Objekt einen Impuls aus, der sowohl die geschwindigkeit, als auch die Drehungsgeschwindigkeit des Objektes beeinflusst
         //  start: Die Startposition des Impulses in der Welt
         //  speed: Die Geschwindigkeit des Impulses in der Welt
-        __declspec( dllexport ) virtual void impuls( Vertex start, Vertex speed );
+        //  strength: Stärke des aufpralls
+        __declspec( dllexport ) virtual void impuls( Vertex start, Vertex speed, float strength = 1.f );
         // Setzt die Geschwindigkeit des Objektes in der Welt
         //  speed: Anzahl der zurückgelegten Koordinaten pro Sekunde
         __declspec( dllexport ) void setSpeed( Vertex speed );

+ 2 - 2
Zeichnung.cpp

@@ -29,8 +29,8 @@ Zeichnung::Zeichnung()
     nTak( 0 ),
     mausIn( 0 ),
     toolTip( 0 ),
-    rend( 0 ),
-    style( 0 )
+    style( 0 ),
+    rend( 0 )
 {}
 
 // Destruktor