2014-07-18 7 views
1

J'utilise blender pour créer mes modèles, et les charger dans Libgdx, si je les crée avec l'origine au centre du modèle comme ci-dessous et ensuite utiliser ce code pour créer le corps rigide, tout fonctionne bienLibgdx balle offset origine

 Vector3 hescoWallHalfExtents = new Vector3(hescoWall.calculateBoundingBox(bounds).getDimensions()).scl(0.5f); 

enter image description here

si je place le fond du niveau du modèle avec le sol comme celui-ci

enter image description here

alors le btRigidbody est décalé comme celui-ci

enter image description here

est-il un moyen évident que je peux compenser la hauteur du modèle du solide indéformable?

merci beaucoup.

Spriggsy

Répondre

4

Le centre (origine) du corps rigide est le même que le centre de masse et à cet effet une propriété importante pour la simulation physique. Vous pouvez "déplacer" ce centre en utilisant un btCompoundShape si vous le souhaitez, mais cela influencera également la simulation physique et ne vous donnera probablement pas de résultats satisfaisants. Vous pouvez également compenser la différence d'origine physique et d'origine visuelle dans votre btMotionState. Par exemple, en définissant ModelInstance#transform sur worldTransform fourni multiplié par l'instance Matrix4 qui contient le décalage (utilisez par exemple Matrix4#translate).

Cependant, ceci est probablement juste le rendant plus complexe que nécessaire. Vous pourriez dire que la vraie question est pourquoi vous voulez compenser le centre du modèle par rapport au corps? Par exemple, dans votre deuxième image, le centre du modèle semble être le même que dans la première image. Vous avez uniquement déplacé le Node, indiquant en principe que vous souhaitez fournir une valeur initiale au membre ModelInstance#transform. Vous pouvez y parvenir en instancier le ModelInstance comme suit:

modelInstance = new ModelInstance(model, "coneNode", true); 

Remplacer "coneNode" avec le nom du noeud tel que créé dans votre application de modélisation. Le dernier argument (true) indique à ModelInstance de définir son membre transform sur la transformation que vous lui avez donnée dans l'application de modélisation. Au besoin, vous pouvez appeler le modelInstance.transform.translate(x, y, z); ou modelInstance.transform.trn(x, y, z); pour déplacer le modèleInstance relative à cette transformation.

Une analyse plus approfondie explication de ce qui peut être trouvé ici: http://blog.xoppa.com/loading-a-scene-with-libgdx/

Notez que cela ne fonctionne que si vous utilisez des fichiers .g3db ou .g3dj (par exemple à l'aide de fbx-conv) créés à partir d'un format de fichier qui prend en charge les transformations de noeud (par exemple .fbx, mais pas .obj)

+0

Je lis votre tutoriel pour 2 jours maintenant, la recherche sur le web entier pour comprendre ce qui a mal tourné, jusqu'à ce que je trouve cela. Wow cela résout tout pour moi. Merci beaucoup! –