Comment puis-je empêcher les corps rigides de se déplacer entre eux en utilisant la physique intégrée d'Unity?

8

J'essaie de créer un jeu où les objets peuvent être glissés, mais j'ai des problèmes avec la physique. Avec des corps rigides qui ont des masses similaires, ils se poussent parfois lorsqu'ils sont traînés et provoquent des mouvements indésirables. Voici une démo .

J'aimerais le faire en utilisant uniquement la physique intégrée d'Unity 3D .

Dans la démo, vous pouvez utiliser la souris pour cliquer et faire glisser des objets. Les cylindres ont tous des collisionneurs de boîtes et des masses de 10000. Ils ont également diverses contraintes en fonction de leur orientation (aucun ne peut tourner, et tous sont contraints en x ou y). La sphère a une masse de 1, un collisionneur de sphères et une contrainte az.

La sphère et les cylindres interagissent bien. Cependant, faire glisser les cylindres les uns sur les autres provoque une intersection. Je ne veux pas ça!

Les cylindres ont l'interpolation réglée sur «Interpoler» et la détection de collision réglée sur «Continue». J'ai lancé le script «DontGoThroughThings» sur tous les cylindres, mais il ne semble rien faire. En ce qui concerne le réglage de la vitesse des corps rigides, j'ai utilisé les deux lignes suivantes avec essentiellement le même résultat:

rb.AddForce(speed * diff * Time.deltaTime - rb.velocity, ForceMode.VelocityChange);
//rb.velocity = speed * diff * Time.deltaTime;

Sans écrire mon propre code de détection de collision, je suis à court d'idées. Y a-t-il un cadre simple ou quelque chose que j'ai manqué?

Avec le contexte expliqué, voici une question plus précise: "Comment faire en sorte que les cylindres de ma démo ne se déplacent pas?"

Jeff
la source
La réduction de la masse des cylindres fait-elle une différence?
MGB
Non, ça va les faire passer plus facilement je pense. De plus, si la masse est similaire à la sphère, la sphère commencera également à traverser les cylindres.
Jeff
Ce qui vous fait penser cela? C'est lorsque les rapports de masse sont plus importants que le moteur physique a plus de mal avec la précision.
MGB
Parce que je l'ai essayé: PI peut télécharger une démo où toutes les masses sont définies sur 1 si vous le souhaitez.
Jeff
Une chose à laquelle je pense est que cela peut être dû à la façon dont je change la vitesse. Je vais essayer de passer à la force à la place
Jeff

Réponses:

2

Sans regarder votre projet / code, je voudrais suggérer ceci:

private bool _mouseOverObject = false;

void Update(){
    if(_mouseOverObject && Input.GetMouseDown(0){
        rigidbody.isKinematic = false; //Let Unity Physics affect the item.
    } else {
        rigidbody.isKinematic = true; //Let it affect other physics but not be affected itself
    }
}

void OnMouseOver(){
    _mouseOverObject = true;
}

void OnMouseExit(){
    _mouseOverObject = false;
}

Il vous permettra de restreindre la physique, mais dans la portée et le moteur physique d'Unity. Vous pouvez bouger avec le script pour qu'il ne verrouille qu'un seul objet à déplacer, etc., mais cela devrait vous aider à démarrer.

Tom 'Blue' Piddock
la source
0

Vous voulez que la détection de collision soit définie Continuous Dynamicpour les objets en mouvement rapide. Continuousest utilisé pour les objets statiques ou à déplacement lent Continuous Dynamicavec lesquels les objets entrent en collision. Voyez ici .

(Gardez à l'esprit que la détection de collision continue coûte cher, alors utilisez-la avec parcimonie)

BlueRaja - Danny Pflughoeft
la source
J'obtiens les mêmes résultats lorsque je règle chacun des cylindres sur Dynamique continue. C'est ce que vous vouliez dire?
Jeff