2017-03-13 4 views
0

Ich habe einen Bauern/Schauspieler, der eine Kugel (ein Schneeball) ist. Wenn ich auf Schnee rolle, wächst er (ich skaliere ihn und füge Masse hinzu).Skalieren einer Kugel erzeugt überlappende Kollisionen

Problem: Ich habe ein seltsames Verhalten, mein Ball rollt aber manchmal "springt" (oder springt auf).

Der Grund scheint zu sein, dass der Ball größer wird und sich mit dem Boden überschneidet, was eine große Kollision verursacht.

Ich habe versucht, seine Position mit einem Offset (Ball->SetAllPhysicsPosition(Ball->RelativeLocation + FVector(0, 0, newRadius-pastRadius);, aber ich habe das gleiche Problem noch zu ändern. (Es „funktioniert“ mit einem großen Offset fest einprogrammiert, aber nicht mit jeder Größe).

Möchten Sie eine haben Idee, wie dieses Verhalten zu beheben?

Dies ist der Code, den ich den Ball zu machen, verwenden wird größer. ich füge Drehmoment um diese zu bewegen.

void ASnowballBall::NotifyHit(...) 
{ 
    float resizeValue = 0.0f; 

    //If the snowball collides with snow, it grows 
    if (Other->GetName().StartsWith("Snow", ESearchCase::IgnoreCase) && Ball->BodyInstance.GetUnrealWorldVelocity().Size() > 50.0f) 
    { 
     // Max size based on mass 
     if (Ball->GetMass() < 10000.0f){ 
      resizeValue = (20.0f/Ball->GetMass())); 
      resizeValue = FMath::Clamp(resizeValue, 0.0f, 0.003f); 

      Ball->SetRelativeScale3D(Ball->RelativeScale3D + resizeValue); 
      Ball->SetMassScale("None", Ball->BodyInstance.MassScale); 
     } 

    } 

Antwort

1

Setzen sie die Waage nicht ändern, den Radius ändern Dann, weil Sie den neuen Radius kennen, können Sie eine Linienverfolgung durchführen Bewegen Sie den Ball nach oben (oder nach unten) um den Unterschied zwischen der Linienentfernung und dem neuen Radius.

Auch wenn Physik wichtig für den Ball in Ihrem Spiel ist, kreuzen Sie CCD in den Aktoreigenschaften an, um eine bessere Kollisionserkennung pro Frame zu ermöglichen. Dies kann jedoch teuer werden, also stelle sicher, dass du dein Spiel viele Male profilierst.