Spróbowałem odtworzyć Twój problem u siebie. Ale chyba nie za bardzo uwidacznia się on u mnie. :)
Na screencaście widać, że początkowe dążenie do źródła grawitacji jest poprawne. Przy zbliżeniu się do źródła grawitacji, wyrażenie potęgowe staje się źródłem problemu: 100/distanceToMum dąży do nieskończoności, co sprawia że po dotarciu do celu, satelita dostaje mega kopa na drugą stronę świata. Nie widzę u siebie tego powolnego lotu oddalania, więc stawiam że jeśli już, to błąd tkwi nie tutaj.
Zaaplikowałem niewielką prymitywną poprawkę, kontrolującą wartość wyrażenia potęgowego, ale wątpię że o to chodzi (sterowanie definem PATH).
Proszę wybaczyć marną jakość kodu - pisany na szybko na podstawie SFMLowego "Hello world" i jakichś zaślepek na Twoje obiekty. Generuję w nim plik, który zawiera parametry ruchu dla każdej klatki. Można z niego wyciągnąć jakieś wnioski.
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <cmath>
#include <iostream>
#include <fstream>
#include <thread>
float vectorLength(const sf::Vector2f &v)
{
return sqrt(v.x*v.x + v.y*v.y);
}
sf::Vector2f normalizeDirection(const sf::Vector2f &v)
{
return sf::Vector2f{v/vectorLength(v)};
}
int main()
{
// Create the main window
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
// Create a graphical text to display
sf::Font font;
if (!font.loadFromFile("arial.ttf"))
return EXIT_FAILURE;
sf::Text text("Hello SFML", font, 50);
// Start the game loop
sf::Texture texture1;
if (!texture1.loadFromFile("satelita.png"))
return EXIT_FAILURE;
sf::Texture texture2;
if (!texture2.loadFromFile("mum.png"))
return EXIT_FAILURE;
sf::Sprite body(texture1);
sf::Sprite mumy(texture2);
sf::Clock clock;
sf::Time delta = clock.restart();
// PARAMETERS
float rush = 0.1;
sf::Vector2f direction{1,1};
float gravity = 5;
body.setPosition(0,0);
mumy.setPosition(100, 200);
direction = normalizeDirection(direction);
sf::Sprite *mum = &mumy;
#define PATCH
#ifdef PATCH
std::ofstream file("pos_patch.txt");
#else
std::ofstream file("pos_original.txt");
#endif
float oldDistance = vectorLength(body.getPosition()-mum->getPosition());
while (window.isOpen())
{
delta = clock.restart();
// Process events
sf::Event event;
while (window.pollEvent(event))
{
// Close window: exit
if (event.type == sf::Event::Closed)
window.close();
}
// Clear screen
window.clear();
//update ruchu satelity podczas jednej klatki
sf::Vector2f straightMovement = sf::Vector2f(delta.asSeconds()*rush*direction.x, delta.asSeconds()*rush*direction.y);
float distanceToMum = vectorLength(body.getPosition()-mum->getPosition());
float epsilon = 0.000001;
float powerDistanceGravity;
float deltaDistance;
deltaDistance = oldDistance - distanceToMum;
#ifdef PATCH
if(deltaDistance < epsilon || distanceToMum < 2*deltaDistance)
powerDistanceGravity = 0;
else
powerDistanceGravity = std::pow(gravity, 100/distanceToMum);
#else
powerDistanceGravity = std::pow(gravity, 100/distanceToMum);
#endif
sf::Vector2f toMumMovement = normalizeDirection(mum->getPosition() - body.getPosition());
toMumMovement *= powerDistanceGravity;
body.move(straightMovement + toMumMovement);
file << "dist: " << distanceToMum;
file << " old_dist: " << oldDistance;
file << " delta_dist: " << deltaDistance;
file << " straight: " << straightMovement.x <<" " << straightMovement.y;
file << " toMum: " << toMumMovement.x <<" " << toMumMovement.y;
file << " pos: " << body.getPosition().x << " " << body.getPosition().y << std::endl;
window.draw(mumy);
window.draw(body);
window.display();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
oldDistance = distanceToMum;
}
return EXIT_SUCCESS;
}
dist: 223.607 old_dist: 223.607 delta_dist: 0 straight: 0.000486419 0.000486419 toMum: 0.918552 1.8371 pos: 0.919039 1.83759
dist: 221.552 old_dist: 223.607 delta_dist: 2.05458 straight: 0.00782916 0.00782916 toMum: 0.924702 1.84941 pos: 1.85157 3.69483
dist: 219.474 old_dist: 221.552 delta_dist: 2.07822 straight: 0.00706923 0.00706923 toMum: 0.931055 1.86219 pos: 2.78969 5.56409
dist: 217.383 old_dist: 219.474 delta_dist: 2.09146 straight: 0.00707199 0.00707199 toMum: 0.93762 1.87539 pos: 3.73439 7.44655
dist: 215.276 old_dist: 217.383 delta_dist: 2.1062 straight: 0.00707248 0.00707248 toMum: 0.944409 1.88903 pos: 4.68587 9.34265
dist: 213.155 old_dist: 215.276 delta_dist: 2.12144 straight: 0.00707255 0.00707255 toMum: 0.951434 1.90316 pos: 5.64437 11.2529
dist: 211.018 old_dist: 213.155 delta_dist: 2.13722 straight: 0.00707029 0.00707029 toMum: 0.958709 1.91778 pos: 6.61015 13.1777
dist: 208.864 old_dist: 211.018 delta_dist: 2.15355 straight: 0.00707227 0.00707227 toMum: 0.966249 1.93294 pos: 7.58347 15.1177
dist: 206.694 old_dist: 208.864 delta_dist: 2.17047 straight: 0.00707029 0.00707029 toMum: 0.974069 1.94866 pos: 8.56461 17.0735
dist: 204.506 old_dist: 206.694 delta_dist: 2.18805 straight: 0.00707128 0.00707128 toMum: 0.982188 1.96497 pos: 9.55387 19.0455
dist: 202.299 old_dist: 204.506 delta_dist: 2.20625 straight: 0.00707142 0.00707142 toMum: 0.990623 1.98193 pos: 10.5516 21.0345
dist: 200.074 old_dist: 202.299 delta_dist: 2.22519 straight: 0.00707121 0.00707121 toMum: 0.999395 1.99956 pos: 11.558 23.0411
dist: 197.829 old_dist: 200.074 delta_dist: 2.24489 straight: 0.00707128 0.00707128 toMum: 1.00853 2.01791 pos: 12.5736 25.0661
dist: 195.564 old_dist: 197.829 delta_dist: 2.2654 straight: 0.00707149 0.00707149 toMum: 1.01804 2.03703 pos: 13.5987 27.1102
dist: 193.277 old_dist: 195.564 delta_dist: 2.28674 straight: 0.00707142 0.00707142 toMum: 1.02797 2.05698 pos: 14.6338 29.1743
dist: 190.968 old_dist: 193.277 delta_dist: 2.30904 straight: 0.00707121 0.00707121 toMum: 1.03834 2.07781 pos: 15.6792 31.2592
dist: 188.636 old_dist: 190.968 delta_dist: 2.33229 straight: 0.00707142 0.00707142 toMum: 1.04918 2.09959 pos: 16.7354 33.3658
dist: 186.279 old_dist: 188.636 delta_dist: 2.35663 straight: 0.00706937 0.00706937 toMum: 1.06053 2.1224 pos: 17.803 35.4953
dist: 183.897 old_dist: 186.279 delta_dist: 2.3821 straight: 0.00707333 0.00707333 toMum: 1.07243 2.1463 pos: 18.8825 37.6487
dist: 181.488 old_dist: 183.897 delta_dist: 2.40881 straight: 0.00707135 0.00707135 toMum: 1.08492 2.1714 pos: 19.9745 39.8271
dist: 179.051 old_dist: 181.488 delta_dist: 2.43683 straight: 0.00707114 0.00707114 toMum: 1.09806 2.19778 pos: 21.0797 42.032
dist: 176.585 old_dist: 179.051 delta_dist: 2.46631 straight: 0.00707149 0.00707149 toMum: 1.11189 2.22557 pos: 22.1986 44.2646
dist: 174.088 old_dist: 176.585 delta_dist: 2.49734 straight: 0.00707071 0.00707071 toMum: 1.12648 2.25488 pos: 23.3322 46.5266
dist: 171.558 old_dist: 174.088 delta_dist: 2.53008 straight: 0.00707206 0.00707206 toMum: 1.1419 2.28585 pos: 24.4811 48.8195
dist: 168.993 old_dist: 171.558 delta_dist: 2.56471 straight: 0.00707135 0.00707135 toMum: 1.15823 2.31865 pos: 25.6465 51.1452
dist: 166.392 old_dist: 168.993 delta_dist: 2.60132 straight: 0.00707128 0.00707128 toMum: 1.17556 2.35346 pos: 26.8291 53.5058
dist: 163.751 old_dist: 166.392 delta_dist: 2.64021 straight: 0.00707142 0.00707142 toMum: 1.19399 2.39047 pos: 28.0301 55.9033
dist: 161.07 old_dist: 163.751 delta_dist: 2.68155 straight: 0.00707121 0.00707121 toMum: 1.21364 2.42993 pos: 29.2509 58.3403
dist: 158.344 old_dist: 161.07 delta_dist: 2.72565 straight: 0.00707149 0.00707149 toMum: 1.23465 2.47211 pos: 30.4926 60.8195
dist: 155.572 old_dist: 158.344 delta_dist: 2.77275 straight: 0.00707121 0.00707121 toMum: 1.25717 2.51733 pos: 31.7568 63.3439
dist: 152.748 old_dist: 155.572 delta_dist: 2.82329 straight: 0.00707326 0.00707326 toMum: 1.28138 2.56595 pos: 33.0453 65.9169
dist: 149.871 old_dist: 152.748 delta_dist: 2.87761 straight: 0.00706944 0.00706944 toMum: 1.30752 2.61842 pos: 34.3599 68.5424
dist: 146.934 old_dist: 149.871 delta_dist: 2.9362 straight: 0.00707149 0.00707149 toMum: 1.33582 2.67525 pos: 35.7028 71.2247
dist: 143.935 old_dist: 146.934 delta_dist: 2.99969 straight: 0.00707114 0.00707114 toMum: 1.3666 2.73705 pos: 37.0764 73.9689
dist: 140.866 old_dist: 143.935 delta_dist: 3.06874 straight: 0.00707156 0.00707156 toMum: 1.40024 2.80457 pos: 38.4837 76.7805
dist: 137.722 old_dist: 140.866 delta_dist: 3.14418 straight: 0.00707128 0.00707128 toMum: 1.43718 2.87872 pos: 39.928 79.6663
dist: 134.495 old_dist: 137.722 delta_dist: 3.22702 straight: 0.00707135 0.00707135 toMum: 1.47798 2.96062 pos: 41.413 82.634
dist: 131.176 old_dist: 134.495 delta_dist: 3.31851 straight: 0.00707135 0.00707135 toMum: 1.52333 3.05165 pos: 42.9434 85.6927
dist: 127.756 old_dist: 131.176 delta_dist: 3.42022 straight: 0.00707142 0.00707142 toMum: 1.57412 3.15359 pos: 44.5246 88.8534
dist: 124.222 old_dist: 127.756 delta_dist: 3.53411 straight: 0.00707128 0.00707128 toMum: 1.63147 3.26871 pos: 46.1632 92.1292
dist: 120.559 old_dist: 124.222 delta_dist: 3.66273 straight: 0.00707071 0.00707071 toMum: 1.69688 3.39998 pos: 47.8671 95.5362
dist: 116.75 old_dist: 120.559 delta_dist: 3.80939 straight: 0.00707192 0.00707192 toMum: 1.77234 3.5514 pos: 49.6465 99.0947
dist: 112.771 old_dist: 116.75 delta_dist: 3.97856 straight: 0.00707142 0.00707142 toMum: 1.86056 3.72845 pos: 51.5142 102.83
dist: 108.595 old_dist: 112.771 delta_dist: 4.17638 straight: 0.00707128 0.00707128 toMum: 1.96542 3.93887 pos: 53.4867 106.776
dist: 104.183 old_dist: 108.595 delta_dist: 4.41148 straight: 0.00707248 0.00707248 toMum: 2.09258 4.19404 pos: 55.5863 110.977
dist: 99.4868 old_dist: 104.183 delta_dist: 4.69658 straight: 0.00707022 0.00707022 toMum: 2.25075 4.5114 pos: 57.8441 115.496
dist: 94.4357 old_dist: 99.4868 delta_dist: 5.05116 straight: 0.00707192 0.00707192 toMum: 2.45401 4.91923 pos: 60.3052 120.422
dist: 88.9288 old_dist: 94.4357 delta_dist: 5.50686 straight: 0.00707086 0.00707086 toMum: 2.72696 5.46687 pos: 63.0392 125.896
dist: 82.8101 old_dist: 88.9288 delta_dist: 6.11874 straight: 0.00707142 0.00707142 toMum: 3.11689 6.24918 pos: 66.1632 132.152
dist: 75.8172 old_dist: 82.8101 delta_dist: 6.99284 straight: 0.00707128 0.00707128 toMum: 3.72852 7.47623 pos: 69.8988 139.636
dist: 67.4533 old_dist: 75.8172 delta_dist: 8.36388 straight: 0.00707107 0.00707107 toMum: 4.85074 9.7276 pos: 74.7566 149.37
dist: 56.5739 old_dist: 67.4533 delta_dist: 10.8794 straight: 0.00707156 0.00707156 toMum: 7.67416 15.3918 pos: 82.4378 164.769
dist: 39.3656 old_dist: 56.5739 delta_dist: 17.2083 straight: 0.00707142 0.00707142 toMum: 26.6102 53.3819 pos: 109.055 218.158
dist: 20.2906 old_dist: 39.3656 delta_dist: 19.075 straight: 0.00706937 0.00706937 toMum: -1242.77 -2492.1 pos: -1133.71 -2273.94
dist: 2764.49 old_dist: 20.2906 delta_dist: -2744.2 straight: 0.00707333 0.00707333 toMum: 0.473021 0.948545 pos: -1133.22 -2272.98
dist: 2763.42 old_dist: 2764.49 delta_dist: 1.06934 straight: 0.00707128 0.00707128 toMum: 0.473031 0.948567 pos: -1132.74 -2272.03
dist: 2762.35 old_dist: 2763.42 delta_dist: 1.06958 straight: 0.00707142 0.00707142 toMum: 0.47304 0.948589 pos: -1132.26 -2271.07
dist: 2761.28 old_dist: 2762.35 delta_dist: 1.06934 straight: 0.00707121 0.00707121 toMum: 0.47305 0.948611 pos: -1131.78 -2270.11
dist: 2760.21 old_dist: 2761.28 delta_dist: 1.06934 straight: 0.00707241 0.00707241 toMum: 0.473059 0.948633 pos: -1131.3 -2269.16
dist: 2759.14 old_dist: 2760.21 delta_dist: 1.06958 straight: 0.00707036 0.00707036 toMum: 0.473069 0.948655 pos: -1130.82 -2268.2
dist: 2758.07 old_dist: 2759.14 delta_dist: 1.06958 straight: 0.00707078 0.00707078 toMum: 0.473079 0.948677 pos: -1130.34 -2267.25
dist: 2757 old_dist: 2758.07 delta_dist: 1.06982 straight: 0.00707177 0.00707177 toMum: 0.473088 0.948699 pos: -1129.86 -2266.29
dist: 2755.93 old_dist: 2757 delta_dist: 1.06958 straight: 0.00707149 0.00707149 toMum: 0.473098 0.948721 pos: -1129.38 -2265.34