2017-05-10 4 views
1

Je pense que le HelloWorld.cpp de Bullet Physics donne un exemple de chute libre. Pour vérifier si le résultat de Bullet Physics est conforme à la loi physique, dans HelloWorld.cpp, j'ai changé la position initiale de la sphère de "startTransform.setOrigin (btVector3 (2, 10, 0)); " à "startTransform.setOrigin (btVector3 (2, 0, 0));", et j'ai changé l'étape de simulation de "//dynamicsWorld->stepSimulation(1.f/60.f, 10);" à "dynamicWorld-> stepSimulation (0.1f, 0, 0.1f);"Le résultat de l'exemple HelloWorld dans Bullet Physics n'est pas cohérent avec la loi de chute libre?

Je pense, après ces deux changements, la sortie sera les positions de la sphère en mouvement de chute libre espacées de 0,1 seconde. Je produis également la vitesse linéaire de la sphère à chaque étape de la simulation. Le résultat est: vx, vy, yz, px, py, pz

La première ligne est la vitesse linéaire initiale et la position. Nous pouvons trouver que la vitesse est compatible avec la loi de la chute libre (c.-à-d. V = g * t), mais la position (déplacement) n'est pas compatible avec la loi de la chute libre (c.-à-d./2). Donc, je me demande si Bullet Physics est fiable? Ou ai-je quelque chose de mal?

Merci!

+0

Des pas de 0,1 seconde me paraissent très évidents. Lorsque je modélisais des trajectoires de balles de cricket pour des matches internationaux, j'utilisais un pas de temps d'environ 0,001 seconde (pour autant que je m'en souvienne), afin de réduire les erreurs de progression de la position. Je n'ai pas utilisé BulletPhysics, mais je dirais que cela vous donne un certain temps parce qu'il s'agit d'approximer la position plutôt que d'essayer d'effectuer l'intégration. Essayez de réduire le temps quantique et vous devriez voir l'erreur commencer à converger vers la prédiction mathématique. Oh, et ne supposez rien est dans le vide, jamais! – paddy

+0

Merci beaucoup paddy!Je comprends votre point et j'ai essayé une étape de simulation de 0,001 seconde. Cependant, le résultat n'a montré aucune «convergence» vers la prédiction mathématique de la loi de la chute libre. La vitesse est toujours droite, avec une séquence de "-0,01, -0,02, -0,03, ..., -0,10". Pourtant, la séquence de position est "-0.00001, -0.00003, -0.00006, -0.00010, ..., -0.00045, -0.00055", qui est le résultat en utilisant 0.1s multiplié par 10000! – Langping

+0

Cela vous donne-t-il des deltas de position au lieu d'une position absolue? Avez-vous lu la documentation attentivement? – paddy

Répondre

2

Je ne connais pas beaucoup Bullet en particulier, mais je peux peut-être vous aider avec quelques informations générales sur les moteurs physiques.

Les moteurs physiques sont essentiellement des intégrateurs numériques. Ils ne produisent pas une solution analytique précise aux équations cinématiques, mais plutôt numériquement résument les vitesses à chaque pas de temps pour générer les positions. (Et résumer numériquement les accélérations/forces pour produire les vitesses, etc). Parmi les numéros que vous avez trouvés, il semble que Bullet Physics utilise le Euler Method pour le calcul de l'intégrale. C'est l'une des méthodes les moins précises pour calculer une intégrale, mais c'est aussi l'une des plus simples, à la fois pour comprendre et pour calculer.

Les vitesses sont précises, car l'accélération est constante, mais les positions sont inexactes car la vitesse n'est pas constante. Bullet Physics n'est pas fiable ou faux, il utilise simplement une approximation qui n'est pas particulièrement précise; probablement pour avoir la performance de calculer des résultats en temps réel dans des scènes complexes.

+0

Merci beaucoup! J'ai compris. Pourtant, cela signifie-t-il que nous devons subir «l'imprécision numérique» si nous utilisons Bullet ou tout autre moteur de physique? Y a-t-il une solution que nous pouvons utiliser pour réduire cette imprécision numérique, en particulier pour Bullet Physics? Comme la solution proposée par le paddy, même après un test, j'ai trouvé que ça ne marchait pas. – Langping

+0

@Langping: La réduction du pas de temps réduit l'ampleur de l'erreur, mais il y aura toujours une dérive dans le temps. Si vous cherchez des résultats précis, je vous suggérerais d'utiliser un moteur physique différent, plus orienté vers des applications scientifiques/d'ingénierie, plutôt que vers des jeux en temps réel. Habituellement, les moteurs de physique de jeu visent à avoir des résultats stables (c'est-à-dire, pas d'explosions), mais ne visent pas une précision physique. Par exemple, Project Chrono propose une [variété d'intégrateurs] (http://api.chrono.projectchrono.org/classchrono_1_1_ch_timestepper.html) avec des précisions différentes. – Mankarse

+0

Merci Mankarse, ça devient plus clair pour moi! – Langping

0

La plupart des moteurs de physique (y compris Bullet) utilisent l'intégration semi-implicit Euler qui est seulement précise de premier ordre. Une équation de chute libre est du second ordre (y = y0 + vy0 * t - 0.5 * g * t^2, elle a un terme t^2) et donc Euler semi-implicite va induire l'erreur.

En général, je ne m'attendrais pas à ce que les moteurs physiques soient extrêmement précis (il y a beaucoup d'hypothèses et d'approximations). Cependant, ils peuvent être un modèle de réalité acceptable selon ce dont vous avez besoin.