Comment détecter que mon objet est entièrement à l'intérieur d'une boîte?
Je suis en train de développer un jeu que vous faites glisser et déposer des objets dans des boîtes et je n'ai aucune idée de quelle est la meilleure et la plus efficace pour détecter si mes objets sont dans une boîte.
Je suis bien conscient de collisionneurs et je suis en utilisant BoxColliders et des déclencheurs pour savoir si mon objet est de toucher une boîte, mais je tiens à détecter le moment où mon objet (que nous pouvons supposer être sphère pour des raisons de simplicité, mais plus tard sera un maillage) est complètement à l'intérieur de ma zone de déclenchement/collider.
J'ai lu "Contient" méthode de collisionneurs mais SI ils ont juste vérifier si un seul point à l'intérieur que collider, mais je suis intéressé de savoir si l'ensemble de l'objet est à l'intérieur du collisionneur.
Merci d'avance les gens.
OriginalL'auteur test84 | 2012-10-27
Vous devez vous connecter pour publier un commentaire.
Réponse courte: Si vous souhaitez une précision de 100%, votre algorithme ne sera jamais mieux que O(|V|) (pire des cas) où V = {tous les sommets d'un maillage}, ce qui signifie que vous feriez exécuter .Entre en collision() sur tous les sommets et pause si vous en trouver un qui est à l'extérieur de votre conteneur.
Plus réponse: Plusieurs méthodes existent pour subdiviser maillage des surfaces, les exemples comprennent: KD-Trees, OcTrees. Ces sont au-delà de la portée d'une SORTE de réponse à fournir une implémentation complète, je vous suggère de voir les pages wiki pour plus de détails.
Vous pouvez utiliser ces méthodes pour diviser votre maillage dans de petits ensembles de sommets. Pour accélérer l'algorithme que vous commencer à la racine de votre subdivision de l'arbre et de tester si ce nœud est contenue dans votre boîte. Continuer à travailler à travers les arbres jusqu'à ce que vous trouver un nœud qui n'est pas contenue par votre box. Cela permettra à votre "contient" test à l'échec plus vite, mais en fin de compte, vous aboutirez à l'essai de chaque sommet si votre boîte contient votre maillage.
Mise en garde: Cette solution ne fonctionne pas si votre mesh est animé. Dans ce cas, votre meilleur pari est d'utiliser les limites autour des choses comme les bras, les pieds, les jambes, etc et utiliser cette information pour choisir votre Contains() des tests. Encore une fois, vous finirez par avoir à tester chaque sommet si le maillage est entièrement à l'intérieur de votre boîte.
OriginalL'auteur Jerdak
Toutes les cases ont un boxCollider. Si un objet touche le deuxième zone, l'objet doit être à l'intérieur de la première zone.
Ce n'est pas une bonne solution, mais peut-être que cela sera utile.
OriginalL'auteur Halil Cosgun
Utilisation Moteur de rendu.limites propriété pour obtenir la boîte englobante de l'objet.
En fonction de ce que l'objet que vous avez et le degré de précision que vous souhaitez vérifier qu'il soit à l'intérieur d'un collisionneur vous pourriez que l'utilisation de l'une des façons simples de le déterminer.
OriginalL'auteur Valentin Simonov
pour un effet plus raffiné et plus propre approche. ce serait parfait pour ce que vous faites .
vous pouvez vérifier la distance entre les objets en les faisant glisser et en la boîte .
la boîte a un x,y,z de la valeur qui représente sa position dans l'espace.
ainsi, lorsque vous faites glisser votre gameobject il est peut-être de 0,2 sur x,y ou z à l'écart de la centere de votre box. donc, il suffit d'utiliser cette méthode pour calculer la distance entre votre objet déplacé et la boîte.
donc votre gameobject sera dans la boîte .
OriginalL'auteur
La boîte dans une boîte solution ci-dessus est une bonne option, mais si cela ne fonctionne pas (en raison de variable de taille/forme des objets de), vous pourriez être en mesure d'accomplir quelque chose avec De la physique.Raycast ou Collider.Raycast. J'ai eu un problème similaire où j'avais besoin de tester si des points arbitraires ont été contenue à l'intérieur de collisionneurs (dont beaucoup étaient inhabituelles blobby concave objets).
L'idée de base est un "bed of nails" approche où je jetaient des rayons vers le point de départ de multiples directions. Si je frappe de l'extérieur du collisionneur sur tous les rayons, alors je peux être assez confiant sur le fait que le point est contenue à l'intérieur de la collider (mais pas encore tout à fait certain). Voici une photo:
Dans cette image, nous essayons de voir si le point bleu est à l'intérieur du jaune collider. Les flèches VERTES représentent succès raycasts (le jaune collisionneur est touché), et la ROSE est un échec (le jaune collisionneur n'est PAS atteint).
Voici un extrait de code pour illustrer cela:
Une façon, vous pouvez adapter cet algorithme est plutôt que d'utiliser Collider.Raycast, faire de la Physique.Raycast. Si les rayons touché quoi que ce soit d'autre que votre collider, alors vous savez que votre objet cible n'est pas entièrement dans le collisionneur.
OriginalL'auteur hoodlma
Ajouter un BoxCollider qui entoure l'ensemble de l'objet à tester et vérifier ses limites min et max sont contenues dans le BoxCollider son entrée ... cela ne peut pas convenir pour des complexes de maillage des objets, mais vous pouvez être en mesure de sortir avec elle et ses chers
OriginalL'auteur Bytemysoftware
Simplement,
Vous pouvez placer une boîte Collider au fond de votre récipient.. Si votre sphère ou quel que soit l'objet qui touche alors qu'il est complètement à l'intérieur du conteneur..
OriginalL'auteur ankit jain
Vous devez utiliser un collisionneur. C'est la description. http://docs.unity3d.com/Documentation/ScriptReference/Collider.html
OriginalL'auteur Forcesoft