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 :
/// 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
Hors ligne
probablement lier a la façon d'appeller stepSimulation
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
Merci Magun,
visiblement tu as raison çà vient bien de çà, et j'avais écris :
btScalar walkSpeed = walkVelocity * dt; avec : World->stepSimulation(dt,10.0f);
Que j'ai remplacé par :
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
temps que tu est > à 60 fps oui
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
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
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
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
non pas de soucis le forum est la pour ça !!
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
Bin mes difficultés c'est juste la compréhension du raisonnement sur moteur physique. Par exemple, quand je prend ce 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
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