#0 

26-04-2015 19:32:19

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Bonjour,

Depuis peut de temps je me suis mis à utiliser bullet, je suis entrain de faire le déplacement d'un personnage en manipulant un btPairCachingGhostObject*. Le soucis c'est que le rendu saccade, le cube ne se déplace pas à vitesse constante. Je pense que il y a un lien avec le pas de simulation, mais j'ai fais plusieurs essais et c'est sans succès (J'utilise EDT_OPENGL pour le device).

Dans mon application il y a un cube qui se déplace et le sol :

Code:

/// Create a Static Plane to walk around on
   // Segfaults- I think it's segfaulting when the objects collide in the loop
   btDefaultMotionState* bullet_MotionState = new btDefaultMotionState( btTransform(btQuaternion(0,0,0,1), btVector3(0,0,0)));
   btCollisionShape* bullet_Shape = new btStaticPlaneShape( btVector3(0,1,0), 1);         // Create Plane Shape
   btRigidBody::btRigidBodyConstructionInfo bullet_RigidBodyCI( 0, bullet_MotionState, bullet_Shape, btVector3(0,0,0) );
   btRigidBody* bullet_RigidBody = new btRigidBody( bullet_RigidBodyCI );
   World->addRigidBody( bullet_RigidBody );
   // Creating the Terrain in Irrlicht
   float scale_val = 1;
   float hm_size = 512;
   float offset = ((hm_size*scale_val)/2)*-1;
   ITerrainSceneNode *node = smgr->addTerrainSceneNode("marron.png", 0, -1, vector3df( offset, 0, offset ) , vector3df(0.f, 0.f, 0.f), vector3df(scale_val, 0.0, scale_val) );
   node->setMaterialFlag(EMF_LIGHTING, true);
   ///node->setMaterialFlag(EMF_WIREFRAME, !node->getMaterial(0).Wireframe);
   node->setMaterialTexture( 0, driver->getTexture("marron.png") );

Si c'est une question de ressource, je ne vois pas sur quoi je peux jouer pour que çà ramme moins... Si qu'elqu'un a une idée, elle sera la bienvenue. En attendant merci pour votre aide smile

Hors ligne


#1 

26-04-2015 19:44:50

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

probablement lier a la façon d'appeller stepSimulation

Code c++ :


            irr::f32 DeltaTime = (time-TimeStamp)/1000.0f;

            if(DeltaTime >= fixedTimeStep)
            {
                dynamicsWorld->stepSimulation(DeltaTime, maxSubSteps, fixedTimeStep);
                TimeStamp = time;
            }



tu peut également simuler la physique dans un autre thread
neamoins si c'était une question de ressources tu aurais un fps pourris

Hors ligne


#2 

26-04-2015 22:36:03

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Merci  Magun,
visiblement tu as raison çà vient bien de çà, et j'avais écris :

Code:

btScalar walkSpeed = walkVelocity * dt;
avec :
World->stepSimulation(dt,10.0f);

Que j'ai remplacé par :

Code:

btScalar walkSpeed = walkVelocity * 0.001;
avec :
 World->stepSimulation(dt, 10);

Visiblement çà a corrigé le problème néanmoins est-ce correcte ? (La vitesse de déplacement ne dépend plus du temps de la boucle mais le pas de simulation seul en dépend )

PS : Je tourne entre 850 et 1000 fps c'est bien ?

Dernière modification par jonath313 (26-04-2015 23:00:57)

Hors ligne


#3 

27-04-2015 00:30:36

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

temps que tu est > à 60 fps oui wink

il y a plusieur façon d'établir la simulation avec bullet
soit tu utilise maxSubSteps=0 pour desactiver les interpollations de mouvement
et tu calcule toi même les différences temporelle

soit tu utilise maxSubSteps>0, et tu utilise des constantes, le reste c'est bullet qui ce charge de cela
bullet va en réaliter ce mettre a jours de façons indépendantes du fps basé sur fixedTimeStep
les mouvement entre DeltaTime et fixedTimeStep seront en réaliter interpoller
et tu n'auras donc aucun soucis temporelle

http://www.bulletphysics.org/mediawiki- … _The_World

tu passe bien par un KinematicCharactereControler ?

Hors ligne


#4 

27-04-2015 22:02:03

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

oui je passe par un KinematicCharactereControler , par contre j'ai juste ajouté un cube  btRigidBody *TObject et mon rendu est tombé à 60 fps et çà ramme énormément.

La solution que tu m'as montré comporte pleins de variables ...
DeltaTime : dt ok
TimeStamp : temps de boucle ok
time : le temps courant ok

Mais je fais quoi avec fixedTimeStep, maxSubSteps ?

Merci.

Dernière modification par jonath313 (27-04-2015 22:02:24)

Hors ligne


#5 

27-04-2015 23:05:26

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

pour ton soucis de fps, peut-être faudrait-il un bouts de code pour que je regarde de plus près
ensuite pour les variables, j'ai l'impression que tu ne fait pas beaucoup de recherche ...
d'ailleurs tout est dans le liens que j'ai mis (tu comprendre l'anglais je suppose ?).

je t'est expliquer le role de maxSubSteps et fixedTimeStep dans mon précédants post
enfin n'ai je peut être pas été asser explicite  fixedTimeStep c'est le "fps" de ta physique (
et maxSubSteps c'est le nombre d'interpollation maximal pour completer les trous avec le fps réelle
mes pour les calibrages c'est à toi de jouer, je ne peut connaitre t'est beusoin

donc que veut tu savoir de plus sur ces deux variables ?

faut savoir que je passe beaucoup de temps sur certains post
le temps de re-rechercher, de vérifier ce que je dit, de faire des traductions avec des terme pas toujours existant en français ... etc
le dernier gros post d'une page pour t'expliquer l'animation physique d'un ragdoll m'a prit +2h

Hors ligne


#6 

27-04-2015 23:27:15

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Si si je cherche beaucoup mais çà fais qu'une semaine que je me suis plongé dans bullet alors c'est un peut la jungle. Je fais du graphisme à la base moi et je bosse dans l'électronique alors la programmation physique c'est complétement nouveau pour moi. En tout cas je suis désolé d'abuser de tas sympathie mais tu m'as beaucoup aidé jusqu'ici et c'est pour cela que je n'ai pas laissé tombé...

En tout cas merci et désolé d'assaillir le forum de questions.

Hors ligne


#7 

27-04-2015 23:39:40

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

non pas de soucis le forum est la pour ça !! smile
si tu a des soucis technique, des questions, des explications pas de soucis

c'est juste sur ces 2 topic j'ai tout de même eu l'impression d'avoir du mal a te faire comprend certaine chose
mon point de vue, reste que je ne suis pas sencé te donner les solutions pré-maché surtout si tu commence
et t'amener a la compréhension de ton code

après tu m'excuseras je programme depuis +10ans je peut avoir du mal a cerner t'est difficulter
ça reste un exercice intéressant pour moi

Hors ligne


#8 

28-04-2015 13:21:32

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Bin mes difficultés c'est juste la compréhension du raisonnement sur moteur physique. Par exemple, quand je prend ce code :

Code:

   /// Setup Character Controlable Capsule Shape
   btTransform startTransform;
   startTransform.setIdentity ();
   startTransform.setOrigin (btVector3(0.0, 50.0, 0.0)); // Create it 150 units in the air, so we have some time before contact with the plane

   GhostObject = new btPairCachingGhostObject();
   GhostObject->setWorldTransform(startTransform);
   sweepBP->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback());
   btScalar characterHeight=1.75;
   btScalar characterWidth =1.75;
   capsule = new btCapsuleShape(characterWidth,characterHeight);

///MASSE NE FONCTIONNE PAS
//btScalar   mass(0.0f);
//btVector3 localInertia(0,0,0);
//capsule->calculateLocalInertia(mass,localInertia);


   GhostObject->setCollisionShape (capsule);
   GhostObject->setCollisionFlags (btCollisionObject::CF_CHARACTER_OBJECT); //btCollisionObject::CF_NO_CONTACT_RESPONSE
   World->addCollisionObject(GhostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter);

   btScalar stepHeight = btScalar(0.35);
   Character = new btKinematicCharacterController (GhostObject,capsule,stepHeight);
   World->addAction(Character);

   // Create a Cube to follow the Ghost/Character Capsule and a few lights and a camera so we can see the world
   player_model_node = smgr->addCubeSceneNode(2);
   smgr->addLightSceneNode(0, vector3df(6,8,-5), SColorf(0.58f,0.73f,0.89f,1.0f), 19.0f);
   smgr->addLightSceneNode(0, vector3df(-6,1,5), SColorf(0.58f,0.73f,0.89f,1.0f), 19.0f);

Il y a du monde quand même, mais tu vois là où j'ai étais ennuyé c'est que je me suis dis : mon but c'est de faire déplacer tout çà au niveau position, sur qui agir ? ... J'ai finis par trouver, mais maintenant je me rend compte que la configuration de la masse de la capsule ne fonctionne pas. Avec un rigidbody çà marche mais là j'ai surement du oublier quelque chose et j'ais aucune idée de ce que çà peut être. La capsule tombe sur le sol çà ok, mais je ne vois pas du tout à quelle moment je l'ais demandé. La difficulté pour chercher quelque chose c'est de savoir comment çà s'appel ...

Hors ligne


#9 

29-04-2015 09:48:34

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

comment déduit tu que la masse est sens effet ?

a qu'elle moment ? mais enfin quand tu rajoute un node avec irrlicht il apparait non ? ba c'est pareille
a partir du moment ou tu ajoute un objet a la simulation et que tu appelle stepSimulation ton objet bouge
a par évidement si tu dit explicitement qu'il est statique ou qu'il y a des contraintes

btKinemacticControler:
    "It uses a ghost object and convex sweep test to test for upcoming collisions."
    "Interaction between btKinematicCharacterController and dynamic rigid bodies needs to be explicitly implemented by the user."
d'où l'utilisation de btGhostPairCachingObject

Hors ligne


#10 

09-05-2015 02:19:05

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

ok merci Magun !

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
72 invités en ligne
Aucun membre connecté
RSS Feed