Wie erkenne ich, dass sich mein Objekt vollständig in einer Box befindet?

8

Ich entwickle ein Spiel, bei dem Sie Objekte in Boxen ziehen und ablegen, und ich habe keine Ahnung, was der beste und effizienteste Weg ist, um zu erkennen, ob sich meine Objekte in einer Box befinden.

Ich kenne Collider sehr gut und benutze Boxcollider und Trigger, um herauszufinden, ob mein Objekt eine Box berührt, aber ich möchte den Moment erkennen, in dem mein Objekt (aus Gründen der Einfachheit kann man davon ausgehen, dass es eine Kugel ist) aber später wird ein Mesh sein) ist komplett in meiner Box trigger / collider.

Ich lese über "Contains" Methode der Collider aber IIRC sie nur überprüfen, ob ein einzelner Punkt in diesem Collider, aber ich bin interessiert zu wissen, ob das ganze Objekt im Collider ist.

Vielen Dank im Voraus Leute.

    
test84 27.10.2012, 16:01
quelle

8 Antworten

2

Kurze Antwort: Wenn Sie eine 100% ige Genauigkeit wünschen, ist Ihr Algorithmus niemals besser als O (| V |) (Worst-Case), wobei V = {alle Knoten im Netz}, also Sie ' d renne .Collides () über jeden Scheitelpunkt und brich, wenn du einen außerhalb deines Containers findest.

Längere Antwort: Es gibt mehrere Methoden, um Mesh-Oberflächen zu unterteilen. Beispiele sind: KD-Trees , OcTrees . Dies würde den Rahmen einer SO-Antwort sprengen, um eine vollständige Implementierung bereitzustellen. Ich schlage vor, dass Sie die Wiki-Seiten für Details sehen.

Sie können diese Methoden verwenden, um Ihr Mesh in kleinere Scheitelpunkte aufzuteilen. Um Ihren Algorithmus zu beschleunigen, würden Sie am Stamm Ihrer Untergliederungsstruktur beginnen und testen, ob dieser Knoten in Ihrer Container-Box enthalten ist. Arbeiten Sie weiter durch den Baum, bis Sie einen Knoten finden, der nicht in Ihrer Box enthalten ist. Dadurch kann Ihr "contains" -Test schneller fehlschlagen, aber letztendlich werden Sie jeden Vertex testen, wenn Ihre Box Ihr Mesh enthält.

Vorbehalt: Diese Lösung funktioniert nicht, wenn Ihr Netz animiert ist. In diesem Fall ist es am besten, die Begrenzungen für Dinge wie Arme, Füße, Beine usw. zu verwenden und diese Informationen zu verwenden, um Ihre Contains () - Tests zu löschen. Auch hier müssen Sie jeden Knoten testen, wenn sich das Gitter vollständig in Ihrer Box befindet.

    
Jerdak 30.10.2012 13:56
quelle
2

Alle Boxen haben eine BoxCollider. Wenn ein Objekt die zweite Box berührt, muss das Objekt innerhalb der ersten Box sein.

Das ist keine gute Lösung, aber vielleicht wird es nützlich sein.

    
Halil Cosgun 23.07.2013 14:30
quelle
1

Verwenden Sie die Renderer.bounds -Eigenschaft, um die Begrenzungsbox Ihres Objekts zu erhalten.

Je nachdem, welches Objekt Sie haben und wie genau Sie es innerhalb eines Colliders überprüfen möchten, können Sie eine der einfachen Methoden verwenden, um dies zu bestimmen.

    
Valentin Simonov 28.10.2012 01:42
quelle
0

Fügen Sie einen BoxCollider hinzu, der das gesamte Objekt umgibt, für das Sie testen, und überprüfen Sie, ob die Grenzen min und max innerhalb des BoxColliders liegen. Dies ist möglicherweise nicht für komplexe Mesh-Objekte geeignet, aber Sie können möglicherweise davonkommen damit und seine billige

    
Bytemysoftware 04.02.2013 13:06
quelle
0

Einfach, Du kannst eine Box Collider am Boden deines Containers platzieren. Wenn deine Sphäre oder was auch immer das Objekt berührt dann ist es komplett innerhalb des Containers ..

    
ankit jain 06.07.2013 12:03
quelle
0

für einen raffinierteren und saubereren Ansatz. das wäre perfekt für das, was du tust. Sie können den Abstand zwischen dem Objekt, das Sie ziehen, und der Box überprüfen.

Das Feld hat einen x, y, z-Wert, der seine Position im Raum darstellt.

Wenn Sie also Ihr Spielobjekt ziehen, kann es auf dem X, Y oder Z nur 0,2 von der Mitte Ihrer Box entfernt sein. Verwenden Sie einfach diese Methode, um den Abstand zwischen Ihrem gezogenen Objekt und der Box zu berechnen.

%Vor%

also wird dein Spielobjekt in der Box sein.

    
user2423014 28.10.2013 22:16
quelle
0

Die Box in einer Box Lösung ist eine gute Option, aber wenn das nicht funktioniert (aufgrund von variablen Größe / Form-Objekte) können Sie etwas mit Physics.Raycast oder Collider.Raycast erreichen . Ich hatte ein ähnliches Problem, wo ich testen musste, ob willkürliche Punkte in den Collidern enthalten waren (von denen viele ungewöhnliche, konkave Objekte waren).

Die Grundidee ist ein "Nagelbett" -Ansatz, bei dem ich aus mehreren Richtungen Strahlen auf den Punkt werfe. Wenn ich bei allen Strahlen auf den Außenbeschleuniger treffe, kann ich ziemlich sicher sein, dass der Punkt im Inneren des Beschleunigers enthalten ist (aber immer noch nicht ganz sicher ist). Hier ist ein Bild:

In diesem Bild versuchen wir zu sehen, ob der blaue Punkt innerhalb des gelben Colliders ist. Die GRÜNEN Pfeile stellen erfolgreiche Raycasts dar (der gelbe Collider wird getroffen), und der PINK ist erfolglos (der gelbe Collider wird NICHT getroffen).

Hier ist ein Codeausschnitt, der dies veranschaulicht:

%Vor%

Eine Möglichkeit, diesen Algorithmus anzupassen, ist, anstatt Collider.Raycast zu verwenden, eine Physics.Raycast. Wenn die Strahlen auf etwas anderes als Ihren Collider treffen, wissen Sie, dass sich Ihr Zielobjekt nicht vollständig im Collider befindet.

    
hoodlma 06.02.2014 05:22
quelle
-1

Sie sollten einen Collider verwenden. Dies ist eine Beschreibung. Ссылка

    
Forcesoft 09.04.2013 20:14
quelle

Tags und Links