Set Bounding-Collision Box for AR Planes?

  • Hi Leute,



    an folgendem bin ich aktuell hängen geblieben. Egal was ich in Google oder Youtube eingebe *dead* -

    ich finde einfach keine Lösung, dabei ist es bestimmt recht einfach.


    Für mein AR Template:

    Da wird zu Begin das AR-Tracking gestartet und führt dann zu AR Planes, welche für die Kollision

    und das setzen des AR Objects als Spawn führen.


    Die generierten AR Planes sind einfache ganz normale Flächen, welche sich aber jederzeit in der Größe verändern können, wenn mehr getrackt wurde. Generell sind es einfach Flächen oder Planes - Das sieht so aus - siehe hier ab Minute 9:30:

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Wenn ich auf den Screen Touche wird ein LineTrace durchgeführt, der dann das gew. Ar Objekt auf der Plane platziert.

    Wenn ich das Objekt per Swipe jetzt im Raum verschiebe, soll es nicht über diese EINe angeklickte AR Fläche, auf der es erzeugt wurde, hinausgezogen werden können. Es soll sich einfach nur auf dieser Fläche bewegen können und an den Rändern stoppen.

    Also eigentlich ne ganz einfache Kollision an allen Grenzen der Fläche. Wie bekomme ich das denn hin. Das Objekt ist natürlich flach, ich bräuchte aber eigentlich imaginäre Wände an den Außenseiten der Fläche für die Kollision.


    Vielversprechend sah das "Blocking Volume" aus. Das erzeugt einen schönen Blockwürfel. Die Position und größe könnte ich im Blueprint immer schön an die AR Plane anpassen. Das blockt aber leider nur von außen ;(!! Wenn Mein Objekt da drinnen sitzt lässt es sich gar nicht mehr bewegen. Daher hab ich danach gesucht wie ich das "Blocking Volume" invertieren kann und auch nichts gefunden.


    Ich hab auch danach gesucht wie ich einen Actor auf eine Area einschränken kann. Dann bräuchte ich gar keine Collision.

    Da hab ich nur was für die AI gefunden. Letztendlich geht es mir bei der gew. Technik erst mal nicht genau um die AR Planes, auch wenn ich es später auf deise anwenden will. Aktuell teste ich mit einer einfachen statischen Plane in einem Firstperson Template und meiner Kugel darin welche ich per Maussimuliertem Swipe darin bewegen kann - siehe:



    Wie kann ich einen Actor auf eine spezifische Fläche beschränken, so dass dieser sich nur innerhalb dieser bewegen kann?

    Das Prinzip könnte ich ja dann auf die AR Plane übertragen.... das sollte doch doch irgendwie machbar sein....

  • Du könntest die maximalen Koordinaten berechnen. Durch die Skalierung und Position des Planes, sollte man diese schätze ich gut berechnen können. Alles was diese Werte überschreitet soll demnach nicht überschritten werden. Ansonsten einfach tatsächlich Außenwände mit ner spezifischen Kollision, die vom bewegenden Objekt über ein direktes linetrace erfasst werden kann.


    Das fällt mir jedenfalls spontan dazu ein.

    • Offizieller Beitrag

    Ich würde im 3D Programm die Position auf 0 setzen.

    Genauer gesagt die Translation, Rotation und das Scale. = 0

    Das hat nur nun den Vorteil das du viel besser mit deinem Objekten rechnen kannst.

    Eine Tür könntest du so um 45 Grad öffnen statt irgend wie komplizert um 135.6794 + 45 Grad.


    Bei einem Rigg würde man sog. Limits setzen. Das macht man zb in dem man sagt das sich ein Helenk nur zwischen 0 und 45 Grad nicht aber zwischen 0 und - 45 Grad bewegen dar.

    Dadruch macht das Rigg genau das was es soll und dreht sich die die richtige Richtung. Sowas sollte man wohl auch in Unreal realisieren können wodurch man die Translation einfach Limitiert.

  • Das Objekt ist ein einem Blueprint auf Pos und Winkel 0,0,0 und wird per Touch dann in an die Postion auf die jeweils errechneten und angetouchte AR-Plane gespawnt und hat dann auch wieder genau die Größe von 1 und einen Winkel von 0. Es kann dann aber per GesturePinch/Rotate beleibig skaliert und gedreht werden.


    Shmann hat mir denke ich den richtigen Ansatz gegeben. Die aktuelle Objektgröße sollte ich vermutlich noch zusätzlich aus der Kollisionsberechnung rausrechnen, also abziehen.


    Frage zu dem Winkel? Es gibtz doch globale und lokale Objektkordinaten.

    Der Node "Get ActorTransform" gibt lokale Objektkoordinaten aus? Und "get WorldLocation" oder Transform gib gloabel Koordinaten aus? Die ARPlane wird manchmal auch schief im x,y Raum erzeugt werden....das muss ich mir ansehen wie ich das dann zwischen lokal und globaler Verschiebung verhält...

  • GetActorTransform bezieht sich auf den Worldspace. Der Actor ist das gesamte Objekt mit all seinen Components, wohingegen der Localspace sich nur auf ein einzigen Component und dessen Anordnung innerhalb des Actors bezieht.


    Mit einem Winkel wird denke ich mein Ansatz an seine Grenzen stoßen. Ich schätze hierfür wären Punkte an den Kanten relativ gut. Die sollten mit skalieren und so auch bei einem Winkel zuverlässig die maximalen Grenzwerte geben. Als Kantenpunkte könnte man normale Sceneobjects hernehmen, oder man fügt der Plane Sockets an den Eckpunkten bei.

  • ja leider - das problem liegt zw. Kelt und lokalen Koordinaten.

    die arplane hat ihr lokales Koordinatensystem und der Spawn hat wiederum sein eignes veretztes.

    natürlich könnte ich den spawn auf das lokale Koordinatensystem der Plane setzen, aber das geht nicht, weil der dann jeweils unterschiedlich verdreht zum Betrachter wäre.


    Folgende Idee: Wenn man eine Triggerbox an das lokale Koordinatensystem der Plane anpasst und auch die größe, kann ich dann nicht checken ob der Spawn sich in der Triggerbox befindet oder nicht? Das könnte man dann über eine Branch als Kollisionsverhalten inBox/notInBox = Ture/False verwenden?


    Die eigentlich Größe des Objects müsste ich dann noch damit verrechnen, da ansonsten die Mittelpunktkoordinate des Objekts als Kollision dient ohen den UmRadius des Objektes mit zu beachten...

  • Mal noch ne andere Frage die auch zum Thema indirekt gehört und mich tierisch nervt.

    Zum testen benutze ich das Std.FirstPerson Template. In der Szene erstelle ich mir aktuell immer meine Testobjekte, also die Plane, eine Triggerbox, ein Kollisionsvolumen etc.


    Mein BP_Schaltung mache ich im "FirstPersonCharacter" Blueprint. Jedesmal wenn ich auf einen einfachen Würfel, eine Plane, eine Triggerbox, etc. im BP verweisen will, kann ich keine Variable dafür anlegen, da dort für den Actor immer steht "Editing this value in a class Default Obejct is not allowed!".


    Daher muss ich aktuell gezwungener Maßen immer einen BP aus jedem Objekt machen und kann dann auf diesen über "GetAllActorsFromClass" verweisen und so komme ich dann endlich mal an ein einfaches Grundobjekt ran. Muss man das wirklich immer so machen? Kann man nicht direkt ein Objekt einbinden. Mit "Cast to" komme ich anscheinden gar nicht an so ein einfaches Objekt ran...


    siehe Screenshot:


  • Die Triggerbox hat leider keine Art Koordinatenfeld, welches man mithilfe eines anderen Vektors überprüfen kann. Ich schätze, du erhälst den Spawn mittels eines Linetrace. Du könntest an diese Position wiederum einen Actor spawnen lassen und wenn dieser sich innerhalb der Triggerbox aufhält, darf es spawnen.


    Möchtest du den Actor nur innerhalb einer bestimmten Fläche spawnen lassen, oder auch die Bewegung auf der Plane eingrenzen?

    Zitat

    Wie kann ich einen Actor auf eine spezifische Fläche beschränken, so dass dieser sich nur innerhalb dieser bewegen kann?


  • Wenn du deine Variable auf Public setzt (Instance Editable), kannst du jeweiligen Instanzen, welche im Editor platziert sind, auch einen spezifischen Default geben. Man kann allerdings tatsächlich nicht einen für alle Instanzen gültigen Wert angeben. Wenn dieser allgemein gültig sein soll, muss dieser im Eventgraph definiert sein.

  • Es werden ganz viele AR Tracking Planes erzeugt - das zeigt das Video ganz oben ab 9:30.

    Erst in dem Moment wo ich auf irgendeine Plane touche wird diese ausgewählt - das funktioniert auch und ich kann auch den Namen für diese eine Fläche rausschreiben und auch auf die Pos, Size & Rot der Fläche dann zugreifen. Gleichzeitig wird dann auch der eine Spawn (das gewünschte 3D Objekt) dann an der Position auf der Fläche erzeugt. Jetzt kann ich das Objekt per Gestures drehen, rotieren und skalieren und eben per Swipe verschieben. Und beim Swipen soll das Objekt diese eine, per LinetTace ausgewählte Fläche, eben auch nicht mehr verlassen können...die Fläche kann sich dabei jederzeit in der Größe ändern, aber das sollte kein Problem darstellen. Durch EventTick kann ich die Werte ja djederzeit aktualisieren....


    Zu der Triggerbox mit Event Overlap hab isch schon Sachen gefunden - das könnte gehen - siehe:

    https://answers.unrealengine.c…s-still-within-a-tri.html


    Nochmal zu der Frage ganz oben, wie ich auf die Triggerbox richtig im Blueprint verweisen kann.

    Aktuell möchte die leider nicht die Größe, Rotation und Position der Plane annehmen - so sieht es aktuell aus, aber das juckt die Triggerbox überhaupt nicht... - siehe:




    .. ich vermute das ich den blueprint in dem die Triggerbox ist anspreche, aber nicht die Triggerbox direkt, was ja irgendwie nicht geht, so wie oben beschrieben. Hab ich da einen Denkfehler??

  • Die ARPlane ist eine von flieen ARPlanes welche durch live Cameratracking erzeugt wird und sich dementsprechend auch jederzeit vergrößern kann, wenn die Kamera geschwenkt wird uns es mehr Tracking Punkte gibt (siehe Video ganz oben ab 9:30)


    Der Planeactor? - Ich nenne den Spawn. Das ist irgendein 3D-Objekt, eine Kugel, ein Würfel oder ein Roboter, eine Biene, was auch immer, kann statisch oder animiert sein. Diese sitzt in deinem einem Blueprint auf Pos 0, Rot 0 und skalierung 1,1,1 und wir so auch auf der ARPlane erzeugt und zwar genau da wo dau auf dem Screen ghintoucht, genau auf dieser einen ARPlane die du angetouscht hast...

  • ich mach´n video - ich habs jetzt erst mal auf meinen Server gelegt:

    http://www.digital-connector.c…ndheld-AR-Template_01.mp4


    Letztendlich ist das ein Handheld Template, in welchem ich beliebeige 3D Objekte anzeigen lassen kann und später auch einfach weiterentwicklen kann. Erst mal brauch ich aber den Grundstock.


    Hier siehst du schon wie sich die ARplanes über das Tracking aufbauen und jederzeit in Echtzeit aktualisieren und auch dementsprechend Ihre Größe ändern.


    Die blauen Outlines sind nur der Debugmodus..die sieht man eignetlich nicht, genauso wie die vertikalen Otlines der Planes am Kühlschrank. Das hab ich verboten genauso das man auf eine vertikale Plane ein Objekt setzen/spawnen könnte, bzw. auf die Rückseite einer ARPlane. Das kann man jetzt auch ganz einfach umkehren. Hätte man also z.B. als Objekt ein Wandregal, dann würde ich verbieten dies auf dem Boden zu platzieren und auch das blaue Planeraster dort anzuzeigen zu lassen. Das hier gezeigte Diagramm darf aber nicht an der Wand hängen....das soll wagerecht nur auf eine horizontalen Plane gespawnt werden können. Das funktioniert wunderbar.


    Dann Toucht man mit dem Finger auf irgendeine Plane - diese EINE Plane wird dann per LineTrace ausgewählt und dann erscheint der Spawn genau auf dieser einen Plane an der Koordinate. Den kann ich drehen, rotieren, skalieren und zwar per Gestures (Rotate/Pinch) oder über die Sticks. Ob beides Sinn macht muss ich mir noch überlegen. Aktuell finde ich die Sticks etwas präziser.


    SWIPE (da wo der Finger ist bewegt sich auch realtiv dazu das Objekt hin auf der x und y achse) - das ist hier im Video noch nicht integriert!

    Für AR Mobile muss man jedes mal einen kompletten Build machen und den Mist auf dem Endgerät testen, da Unreal das nicht simulieren kann, da man die Kamera + das Tracking braucht, dass Unreal halt nicht hat.


    Daher habe ich den Swipe im FirstPerson Template angelegt mit einer einfachen Plane.

    Der Swipe funktioniert aber die Kollisionsberechnung an den Grenzkanten der Plane eben nicht. Jetzt kann ich wenigstens, ohne immer einen kompletten Build zu machen, gleichdirekt in Unreal testen.


    Wenn das funzt, dann kann ich es auch auf das AR-Template übertragen und wieder mich mit den Builds und dem Testing rumschlagen... aber der Swipe geht schon mal super exakt.



    Nochmal zu meiner Frage oben. Wie kann ich den auf die TRiggerbox direkt verweisen, bzw, wenn diese in einem Blueprint ist, wieso kann ich dann die Triggerbox nicht auf die exakte Größe der Plane anpassen, wie in dem Screenshot oben gezeigt. Wenn das gehen würde, kann ich mich durchgoogeln (da gibt es Stuff zu) um die Abfrage InTriggerbox - true oder Out of Triggerbox - false zu machen und damit die Kollision umzusetzen,....

  • Ich frag deshalb nach der Skalierung:

    Wenn der Actor als Root einen Scenecomponent hat und die Plane dem untergeordnet ist, du aber die Plane im Localspace anpasst, dann erhälst du beim ActorTransform dennoch nur die Standardskalierung und somit erreichst du keine Veränderung bei der Triggerbox.

    Das ist eine mögliche Fehlerquelle.

  • Da dreh ich mich mit meinen Gedanken auch drumrum.


    Die Triggerbox hab ich einfach erzeugt, bin aber leider daran gescheitert diese im "FirstpersonCharacter" Blueprint anzsprechen. Wie oben im Screenshot gezeigt kann auch keine Variable als TriggerboxActor anlegen, da ich diese nicht mit der Triggerbox füttern kann.


    Daher Frage 1:

    Kann ich die irgendwie direkt ansprechen?


    Aktueller Umweg:

    Als Notlösung/Umweg (will ich eigentlich gar nicht), habe ich die Triggerbox im Worldoutliner angeklickt und dann über den "Blueprints" Button ganz oben in der UI "Convert Selected Actor to Blueprintclass".


    So würde man auch ein typisches PREFAB erstellen. Jetzt konnte ich diesen neuen Blueprint wie oben im Screenshot angezeigt über "GetAllActorsFromCLass" endlich ansprechen, vermute aber, dass ich ja den Blueprint anspreche der die Triggerbox enthält und nicht die Triggerbox direkt selber.


    Der Blueprint mit der Triggerbox, also das Prefab - siehe aktuell so aus:

  • Leider wird das so ohne weiteres nicht funktionieren.

    Es gibt zwar andere Möglichkeiten eine Verbindung zwischen einem Trigger Volume und dem Blueprint herzustellen, aber auch nicht einfach so.

    Du kannst das Triggervolume über das Level Blueprint ansteuern und bei Überlappung direkt auf ein Blueprint zugreifen. Das könnte man über einen Bind auch umkehren und quasi das Blueprint zum Triggervolume kommunizieren lassen. Allerdings wird dir das wahrscheinlich erstmal keinen Vorteil bringen, bis darauf, dass du das TriggerVolume nicht als Blueprint erstellen musst, wenn das für dich einer ist.