Es war im Jahr 2015. Die Virtual-Reality-Brille Oculus DK2 wurde gerade zum Verkauf angeboten. Der Markt für VR-Spiele wurde immer beliebter.
Die Möglichkeiten des Spielers in solchen Spielen waren begrenzt. Es wurden nur 6 Freiheitsgrade der Kopfbewegungen überwacht - Rotation (mit einer Trägheit in der Brille) und Bewegung in einem kleinen Volumen im Sichtfeld einer am Monitor befestigten Infrarotkamera. Der Spielprozess bestand darin, auf einem Stuhl mit einem Gamepad in den Händen zu sitzen, den Kopf in verschiedene Richtungen zu drehen und Übelkeit zu bekämpfen.
Es klang nicht sehr cool, aber ich sah dies als Gelegenheit, etwas Interessantes zu tun, indem ich meine Erfahrung in der Elektronikentwicklung und meinen Durst nach neuen Projekten nutzte. Wie könnte dieses System verbessert werden?
Entfernen Sie natürlich das Gamepad und die Kabel, und geben Sie dem Spieler die Möglichkeit, sich frei im Raum zu bewegen, Hände und Füße zu sehen, mit der Umgebung, anderen Spielern und echten interaktiven Objekten zu interagieren.
Ich habe es so gesehen:
- Wir nehmen mehrere Spieler mit, setzen eine VR-Brille, einen Laptop und Sensoren an Armen, Beinen und Rumpf auf.
- Wir nehmen einen Raum, der aus mehreren Räumen, Korridoren, Türen besteht, statten ihn mit einem Verfolgungssystem aus, hängen Sensoren und Magnetschlösser an die Türen, fügen mehrere interaktive Objekte hinzu und erstellen ein Spiel, bei dem die Geometrie eines virtuellen Ortes genau die Geometrie eines realen Raums wiederholt.
- Wir erstellen ein Spiel. Das Spiel ist eine Multiplayer-Quest, bei der mehrere Spieler Ausrüstung anlegen und sich in einer virtuellen Welt befinden. Darin sehen sie sich selbst, sehen sich, können um den Ort herumgehen, Türen öffnen und gemeinsam Spielprobleme lösen.
Ich erzählte diese Idee meinem Freund, der sie unerwartet mit großer Begeisterung akzeptierte und anbot, organisatorische Fragen zu übernehmen. Also beschlossen wir, das Startup durcheinander zu bringen.
Um die deklarierte Funktionalität zu implementieren, mussten zwei Haupttechnologien erstellt werden:
- Ein Anzug bestehend aus Sensoren an Armen, Beinen und Rumpf, die die Position der Körperteile des Spielers verfolgen
- Ein Tracking-System, das Spieler und interaktive Objekte im 3D-Raum verfolgt.
Die Entwicklung der zweiten Technologie wird in diesem Artikel erörtert. Vielleicht schreibe ich später über den ersten.
Verfolgungssystem.
Natürlich hatten wir kein Budget für all das, also mussten wir alles aus Schrott herstellen. Für die Verfolgung von Spielern im Weltraum habe ich mich für optische Kameras und LED-Marker entschieden, die an VR-Brillen angebracht sind. Ich hatte keine Erfahrung mit einer solchen Entwicklung, aber ich hörte bereits etwas über OpenCV, Python und dachte, dass ich es schaffen könnte.
Wenn das System wie geplant weiß, wo sich die Kamera befindet und wie sie ausgerichtet ist, können Sie anhand der Position des Markierungsbilds auf dem Rahmen die gerade Linie im 3D-Raum bestimmen, auf der sich diese Markierung befindet. Der Schnittpunkt zweier solcher Linien ergibt die endgültige Markierungsposition.
Dementsprechend mussten die Kameras an der Decke befestigt werden, so dass jeder Punkt im Raum von mindestens zwei Kameras betrachtet wurde (vorzugsweise mehr, um die Sicht durch die Körper der Spieler nicht zu behindern). Um die vermeintlichen Räumlichkeiten mit einer Fläche von ca. 100 Quadratmetern mit Tracking abzudecken, waren ca. 60 Kameras erforderlich. Ich habe damals die ersten verfügbaren billigen USB-Webcams ausgewählt.
Diese Webcams müssen mit etwas verbunden sein. Experimente haben gezeigt, dass bei Verwendung von USB-Verlängerungskabeln (zumindest billigen) die Kameras zu stören begannen. Aus diesem Grund habe ich beschlossen, die Webcams in Gruppen von 8 Teilen zu unterteilen und sie in die an der Decke montierten Systemeinheiten zu stecken. Es gab nur 10 USB-Anschlüsse an meinem Heimcomputer, daher ist es Zeit, mit der Entwicklung eines Prüfstands zu beginnen.
Die Architektur, die ich mir ausgedacht habe, ist folgende:
An jeder Brille hängt eine mit Acryl gefrostete Kugel aus einer Girlande mit einer innen geklebten RGB-LED. Es sollten mehrere Spieler gleichzeitig im Spiel sein, daher entschied ich mich zur Identifizierung, sie nach Farben zu trennen - R, G, B, RG, RB, GB, RB. So sah es aus:
Die erste Aufgabe, die ausgeführt werden muss, besteht darin, ein Programm zum Finden eines Balls auf einem Rahmen zu schreiben.
Den Ball auf dem Rahmen finden
Ich musste nach den Koordinaten der Mitte des Balls und seiner Farbe suchen, um sie in jedem Bild zu identifizieren, das von der Kamera kam. Klingt einfach. Ich lade OpenCV für Python herunter, schließe die Kamera an USB an und schreibe ein Skript. Um die Auswirkung unnötiger Objekte auf den Rahmen zu minimieren, habe ich die Belichtung und Verschlusszeit der Kamera auf ein Minimum eingestellt, und die Helligkeit der LED ist hoch, um helle Flecken auf dunklem Hintergrund zu erzielen. In der ersten Version war der Algorithmus wie folgt:
- ( , , – ).
- .
- ( )
Es scheint zu funktionieren, aber es gibt Nuancen.
Erstens ist die Matrix bei einer billigen Kamera ziemlich verrauscht, was zu ständigen Schwankungen der Konturen binärisierter Cluster und dementsprechend zu einem Ruckeln des Zentrums führt. Es ist für die Spieler unmöglich, das Bild in einer VR-Brille zu zucken, daher musste dieses Problem gelöst werden. Versuche, andere Arten der adaptiven Binarisierung mit anderen Parametern zu verwenden, zeigten wenig Wirkung.
Zweitens beträgt die Auflösung der Kamera nur 640 * 480, sodass der Ball in einiger Entfernung (nicht sehr groß) als ein paar Pixel im Rahmen sichtbar ist und der Kanten-Suchalgorithmus nicht mehr normal funktioniert.
Ich musste mir einen neuen Algorithmus einfallen lassen. Die folgende Idee kam mir in den Sinn:
- Konvertieren Sie das Bild in Graustufen
- Gaussian blur – ,
- ,
Dies funktioniert viel besser, die Koordinaten des Zentrums sind stationär, wenn der Ball stationär ist, und es funktioniert sogar in großer Entfernung von der Kamera.
Um sicherzustellen, dass all dies mit 8 Kameras auf einem Computer funktioniert, müssen Sie einen Stresstest durchführen.
Lasttest Ich
schließe 8 Kameras an meinen Desktop an, ordne sie so an, dass jeder leuchtende Punkte sieht, und führe ein Skript aus, in dem der beschriebene Algorithmus in 8 unabhängigen Prozessen (dank der Python-Multiprocessing-Bibliothek) funktioniert und alle Threads gleichzeitig verarbeitet.
Und ... ich stoße sofort auf einen Fehler. Kamerabilder erscheinen und verschwinden, die Framerate springt von 0 auf 100, ein Albtraum. Die Untersuchung ergab, dass einige der USB-Anschlüsse meines Computers über einen internen Hub mit demselben Bus verbunden sind. Aus diesem Grund wird die Busgeschwindigkeit auf mehrere Anschlüsse aufgeteilt und reicht für die Bitrate der Kamera nicht mehr aus. Das Anschließen der Kameras an verschiedene Anschlüsse des Computers in verschiedenen Kombinationen zeigte, dass ich nur 4 unabhängige USB-Busse habe. Ich musste ein Motherboard mit 8 Bussen finden, was eine ziemlich schwierige Aufgabe war.
Spoiler
Intel B85, 10 usb . 10- , OpenCV, .. 8 (?)
Ich setze den Belastungstest fort. Dieses Mal sind alle Kameras angeschlossen und geben normale Streams aus, aber ich stoße sofort auf das nächste Problem - niedrige Bilder pro Sekunde. Der Prozessor ist zu 100% ausgelastet und kann nur 8-10 Bilder pro Sekunde von jeder der acht Webcams verarbeiten.
Es sieht so aus, als müsste der Code optimiert werden. Der Engpass stellte sich als Gaußsche Unschärfe heraus (es ist nicht überraschend, da Sie für jedes Pixel des Rahmens eine 9 * 9-Matrix falten müssen). Das Reduzieren des Kernels hat die Situation nicht gerettet. Ich musste nach einer anderen Methode suchen, um die Zentren der Punkte auf den Rahmen zu finden.
Die Lösung wurde plötzlich in der in OpenCV integrierten SimpleBlobDetector-Funktion gefunden. Sie macht genau das, was ich brauche und sehr schnell. Der Vorteil wird durch die sequentielle Binärisierung des Bildes mit unterschiedlichen Schwellenwerten und die Suche nach Konturen erreicht. Das Ergebnis sind maximal 30 fps bei einer CPU-Auslastung von weniger als 40%. Belastungstest bestanden!
Farbklassifizierung
Die nächste Aufgabe besteht darin, den Marker nach seiner Farbe zu klassifizieren. Der durchschnittliche Farbwert über den Punktpixeln ergibt RGB-Komponenten, die sehr instabil sind und je nach Abstand zur Kamera und Helligkeit der LED stark variieren. Aber es gibt eine großartige Lösung: Übersetzung aus dem RGB-Raum mit HSV (Farbton, Sättigung, Wert). In dieser Darstellung wird das Pixel anstelle von "rot", "blau", "grün" in die Komponenten "Farbton", "Sättigung", "Helligkeit" zerlegt. In diesem Fall können Sättigung und Helligkeit einfach ausgeschlossen und nur nach Farbton klassifiziert werden.
Technische Details
, «» . , . , . «» .
:
:
- (, R – )
- , , . «hue – saturation»
- . , .
- , , . . , , . .. , . , - , , .
Und so habe ich im Moment gelernt, wie man Markierungen in Bildern von einer großen Anzahl von Kameras findet und identifiziert. Jetzt können Sie mit der nächsten Stufe fortfahren - der Verfolgung im Weltraum.
Verfolgung
Ich habe ein Lochkameramodell verwendet, bei dem alle Strahlen durch einen Punkt auf der Brennweite der Matrix auf die Matrix fallen.
Dieses Modell transformiert die zweidimensionalen Koordinaten eines Punktes auf dem Rahmen in dreidimensionale Gleichungen einer geraden Linie im Raum.
Um die 3D-Koordinaten des Markers zu verfolgen, müssen Sie mindestens zwei Schnittlinien im Raum von verschiedenen Kameras abrufen und den Schnittpunkt ermitteln. Es ist nicht schwierig, den Marker mit zwei Kameras zu erkennen, aber um diese Linien zu erstellen, muss das System alles über die angeschlossenen Kameras wissen: wo sie hängen, in welchen Winkeln, die Brennweite jedes Objektivs. Das Problem ist, dass nichts davon bekannt ist. Die Berechnung der Parameter erfordert eine Art Kalibrierungsverfahren.
Tracking-Kalibrierung
In der ersten Version habe ich beschlossen, die Tracking-Kalibrierung so primitiv wie möglich zu gestalten.
- Ich hänge den ersten Block von acht Kameras an die Decke, schließe sie an eine dort hängende Systemeinheit an und richte die Kameras so aus, dass sie das maximale Spielvolumen abdecken.
- Mit einem Laserpegel und einem Entfernungsmesser messe ich die XYZ-Koordinaten aller Kameras in einem einzigen Koordinatensystem
- Um Ausrichtungen und Brennweiten von Kameras zu berechnen, messe ich die Koordinaten spezieller Aufkleber. Ich hänge die Aufkleber wie folgt auf:
- In der Oberfläche zum Anzeigen eines Bildes von der Kamera zeichne ich zwei Punkte. Eine in der Mitte des Rahmens, weitere 200 Pixel rechts von der Mitte

- Wenn Sie sich den Rahmen ansehen, fallen diese Punkte irgendwo auf die Wand, den Boden oder ein anderes Objekt im Raum. Ich hänge Papieraufkleber an den entsprechenden Stellen auf und zeichne mit einem Marker Punkte darauf
- Ich messe die XYZ-Koordinaten dieser Punkte mit demselben Pegel und Entfernungsmesser. Insgesamt müssen Sie für einen Block mit acht Kameras die Koordinaten der Kameras selbst und jeweils zwei weitere Punkte messen. Jene. 24 Tripletts von Koordinaten. Und es sollte ungefähr zehn solcher Blöcke geben. Es stellt sich als lange trostlose Arbeit heraus. Aber nichts, ich werde die Kalibrierung später automatisieren.
- Ich starte den Berechnungsprozess basierend auf den gemessenen Daten
- In der Oberfläche zum Anzeigen eines Bildes von der Kamera zeichne ich zwei Punkte. Eine in der Mitte des Rahmens, weitere 200 Pixel rechts von der Mitte
Es gibt zwei Koordinatensysteme: eines global, dem Raum zugeordnet, und das andere lokal für jede Kamera. In meinem Algorithmus sollte das Ergebnis für jede Kamera eine 4 * 4-Matrix sein, die ihre Position und Ausrichtung enthält, sodass Sie Koordinaten von lokal in global konvertieren können.
Die Idee ist wie folgt:
- Wir nehmen die ursprüngliche Matrix mit null Umdrehungen und Versatz.
- , .
- , .
- , . , . . 200 . , .
- (, 200 ).
Sicherlich könnte dieses Problem analytisch gelöst werden, aber der Einfachheit halber habe ich eine numerische Lösung für den Gradientenabstieg verwendet. Es ist nicht beängstigend, weil Berechnungen werden einmal nach der Installation der Kameras durchgeführt.
Um die Kalibrierungsergebnisse zu visualisieren, habe ich eine 2D-Oberfläche mit einer Karte erstellt, auf der das Skript die Beschriftungen der Kameras und die Richtungen zeichnet, in denen sie die Markierungen sehen. Dreiecke repräsentieren Kameraausrichtungen und Betrachtungswinkel.
Testen des Trackings
Sie können mit der Ausführung der Visualisierung beginnen, die anzeigt, ob die Kameraausrichtungen korrekt identifiziert wurden und ob die Bilder korrekt interpretiert wurden. Im Idealfall sollten sich die Linien der Kamerasymbole an einem Punkt schneiden.
Folgendes ist passiert:
Es sieht aus wie die Wahrheit, aber die Genauigkeit könnte deutlich höher sein. Der erste Grund für die Unvollkommenheit, die mir in den Sinn kam, ist die Verzerrung der Kameraobjektive. Dies bedeutet, dass diese Verzerrungen irgendwie kompensiert werden müssen.
Kamera - Kalibrierung
Die ideale Kamera hat nur ein wichtiger Parameter für mich - die Brennweite. Die reale Kamerakurve muss auch die Objektivverzerrung und den Versatz der Matrixmitte berücksichtigen.
Um diese Parameter zu messen, gibt es ein Standardkalibrierungsverfahren, bei dem eine Reihe von Fotos eines Schachbretts mit einer gemessenen Kamera aufgenommen werden, wobei die Winkel zwischen den Quadraten mit Subpixel-Genauigkeit erkannt werden.
Das Ergebnis der Kalibrierung ist eine Matrix, die die Brennweiten entlang zweier Achsen und den Matrixversatz relativ zum optischen Zentrum enthält. All dies wird in Pixel gemessen.
Sowie ein Vektor von Verzerrungskoeffizienten
, mit dem Sie Linsenverzerrungen mithilfe von Pixelkoordinatentransformationen kompensieren können.
Durch Anwenden von Transformationen mit diesen Koeffizienten auf die Koordinaten des Markers auf dem Rahmen können Sie das System auf ein Modell einer idealen Lochkamera bringen.
Ausführen eines neuen Tracking-Tests:
Viel besser! Es sieht so gut aus, dass es sogar zu funktionieren scheint.
Der Kalibrierungsprozess erweist sich jedoch als sehr trostlos: Messen Sie direkt die Koordinaten jeder Kamera, zeigen Sie ein Bild von jeder Kamera an, hängen Sie Aufkleber auf, messen Sie die Koordinaten jedes Aufklebers, schreiben Sie die Ergebnisse in eine Tabelle und kalibrieren Sie die Objektive. Das alles dauerte ein paar Tage und ein Kilogramm Nerven. Ich beschloss, mich mit Tracking zu beschäftigen und etwas Automatisierteres zu schreiben.
Markierungskoordinaten berechnen
Und so bekam ich ein paar gerade Linien, die im Raum verstreut waren und an deren Kreuzungen sich Markierungen befinden sollten. Nur gerade Linien im Raum schneiden sich nicht wirklich, sondern schneiden sich, d.h. in einiger Entfernung voneinander passieren. Meine Aufgabe ist es, den Punkt so nah wie möglich an beiden Geraden zu finden. Formal müssen Sie den Mittelpunkt des Segments finden, der senkrecht zu beiden Linien ist.
Die Länge des Segments AB ist ebenfalls nützlich, weil es spiegelt die "Qualität" des erhaltenen Ergebnisses wider. Je kürzer es ist, je näher die geraden Linien beieinander liegen, desto besser ist das Ergebnis.
Dann habe ich einen Tracking-Algorithmus geschrieben, der die Schnittpunkte von Linien paarweise berechnet (innerhalb derselben Farbe von Kameras, die einen ausreichenden Abstand voneinander haben), nach dem Besten sucht und ihn als Markierungskoordinaten verwendet. In den nächsten Bildern wird versucht, dasselbe Kamerapaar zu verwenden, um einen Koordinatensprung beim Umschalten auf Tracking mit anderen Kameras zu vermeiden.
Parallel dazu entdeckte ich bei der Entwicklung eines Anzugs mit Sensoren ein seltsames Phänomen. Alle Sensoren zeigten unterschiedliche Werte des Gierwinkels (Richtung in der horizontalen Ebene), als ob jeder seinen eigenen Norden hätte. Zunächst war es hilfreich zu überprüfen, ob ich mich in den Datenfilterungsalgorithmen oder im Layout der Karte geirrt habe, aber nichts gefunden habe. Dann entschied ich mich, die Rohdaten des Magnetometers zu betrachten und sah das Problem.
Das Magnetfeld in unserem Zimmer war VERTIKAL UNTEN gerichtet! Anscheinend liegt dies am Eisen in der Gebäudestruktur.
VR-Brillen verwenden aber auch ein Magnetometer. Warum haben sie diesen Effekt nicht? Ich werde nachsehen. Es stellte sich heraus, dass er auch eine Brille hat ... Wenn Sie still sitzen, können Sie sehen, wie sich die virtuelle Welt langsam aber sicher in zufälliger Richtung um Sie dreht. In 10 Minuten verlässt er fast 180 Grad. In unserem Spiel wird dies unweigerlich dazu führen, dass virtuelle und reale Realitäten nicht mehr synchron sind und Brillen gegen Wände zerbrechen.
Es scheint, dass Sie zusätzlich zu den Koordinaten der Brille deren Richtung in der horizontalen Ebene bestimmen müssen. Die Lösung bietet sich an - nicht einen, sondern zwei identische Marker auf die Brille zu setzen. Damit können Sie die Richtung mit einer Genauigkeit von 180 Grad bestimmen. Unter Berücksichtigung des Vorhandenseins eingebauter Trägheitssensoren ist dies jedoch ausreichend.
Das System als Ganzes funktionierte, wenn auch mit kleinen Pfosten. Aber die Entscheidung wurde getroffen, um die Quest zu starten, die gerade von unserem Gamedev-Entwickler abgeschlossen werden sollte, der sich unserem Mini-Team anschloss. Der gesamte Spielbereich wurde zerstört, Türen mit Sensoren und Magnetschlössern installiert und zwei interaktive Objekte hergestellt:
Die Spieler zogen Brillen, Anzüge und Computerrucksäcke an und betraten den Spielbereich. Die Tracking-Koordinaten wurden per WLAN an sie gesendet und zur Positionierung des virtuellen Charakters verwendet. Alles hat gut funktioniert, die Besucher sind glücklich. Am angenehmsten war es, den Schrecken und die Schreie besonders beeindruckbarer Besucher in den Momenten zu beobachten, in denen virtuelle Geister sie aus der Dunkelheit angriffen =)
Skalierung
Plötzlich erhielten wir den Auftrag für einen großen VR-Shooter für 8 Spieler mit Waffen in der Hand. Und das sind 16 Objekte, die gezittert werden müssen. Es war ein Glück, dass das Szenario die Möglichkeit voraussetzte, das Tracking in zwei Zonen mit jeweils 4 Spielern aufzuteilen. Ich entschied, dass es keine Probleme geben würde, ich konnte die Bestellung annehmen und mich um nichts kümmern. Es war unmöglich, das System zu Hause zu testen. Ich benötigte eine große Fläche und eine Menge Ausrüstung, die vom Kunden gekauft werden würde. Vor der Installation beschloss ich, Zeit für die Automatisierung der Tracking-Kalibrierung zu verwenden.
Autokalibrierung
Es war unglaublich unpraktisch, die Kameras zu lenken, all diese Aufkleber aufzuhängen und die Koordinaten manuell zu messen. Ich wollte all diese Prozesse loswerden - die Kameras am Bulldozer aufhängen, zufällig mit dem Marker im Weltraum gehen und den Kalibrierungsalgorithmus ausführen. Theoretisch sollte dies möglich sein, aber wie man sich dem Schreiben eines Algorithmus nähert, ist nicht klar.
Der erste Schritt war die Zentralisierung des gesamten Systems. Anstatt den Spielbereich in Blöcke von 8 Kameras zu unterteilen, habe ich einen einzelnen Server erstellt, der die Koordinaten der Punkte auf den Rahmen aller Kameras gleichzeitig empfing.
Die Idee ist wie folgt:
- Ich hänge Kameras auf und lenke sie mit dem Auge zum Spielbereich
- Ich starte den Aufnahmemodus auf dem Server, in dem alle von Kameras kommenden 2D-Punkte in einer Datei gespeichert werden
- Ich gehe mit einem Marker in der Hand um einen dunklen Spielort herum
- Ich stoppe die Aufnahme und starte die Kalibrierungsdatenberechnung, die die Positionen, Ausrichtungen und Brennweiten aller Kameras berechnet.
- Als Ergebnis des vorherigen Absatzes wird ein einzelner mit Kameras gefüllter Raum erhalten. weil Dieser Raum ist nicht an reelle Koordinaten gebunden, sondern hat einen zufälligen Versatz und eine zufällige Drehung, die ich manuell subtrahiere.
Ich musste eine große Menge an Material über lineare Algebra durchschaufeln und viele hundert Zeilen Python-Code schreiben. So sehr, dass ich mich kaum daran erinnere, wie es funktioniert.
So sieht ein spezieller Kalibrierstift aus, der auf einem Drucker gedruckt ist.
Ein großes Projekt testen
Die Probleme begannen einige Wochen vor dem Start des Projekts während der Tests in der Einrichtung. Das Identifizieren von 8 verschiedenen Markerfarben funktionierte furchtbar, Testspieler teleportierten sich ständig ineinander, einige Farben unterschieden sich überhaupt nicht von externen Highlights im Einkaufskomplex. Vergebliche Versuche, mit jeder schlaflosen Nacht etwas zu reparieren, ließen mich immer mehr verzweifeln. All dies wurde durch die mangelnde Serverleistung bei der Berechnung von Zehntausenden von Geraden pro Sekunde noch verstärkt.
Als der Cortisolspiegel im Blut das theoretische Maximum überschritt, beschloss ich, das Problem aus einem anderen Blickwinkel zu betrachten. Wie können Sie die Anzahl der farbigen Punkte reduzieren, ohne die Anzahl der Marker zu verringern? Aktivieren Sie das Tracking. Lassen Sie zum Beispiel jeden Spieler immer ein rotes Horn am linken Horn haben. Und der zweite leuchtet manchmal grün, wenn ein Befehl vom Server eingeht, so dass er zu einem Zeitpunkt nur von einem Spieler beleuchtet wird. Es stellt sich heraus, dass das grüne Licht von einem Spieler zum anderen zu springen scheint, wodurch die Tracking-Bindung zum roten Licht aktualisiert und der Magnetometer-Orientierungsfehler zurückgesetzt wird.
Dazu musste ich zum nächsten Chipidip laufen, LEDs, Drähte, Transistoren, einen Lötkolben, Klebeband kaufen und die LED-Steuerungsfunktion an die nicht dafür vorgesehene Anzugplatine an Rotz hängen. Es ist gut, dass ich beim Verdrahten der Platine für alle Fälle ein paar freie stm-ki-Beine an die Kontaktflächen aufgehängt habe.
Die Tracking-Algorithmen mussten erheblich kompliziert sein, aber am Ende hat es funktioniert! Die Teleportation der Spieler untereinander verschwand, die Belastung des Prozessors sank, die Fackeln störten nicht mehr.
Das Projekt wurde erfolgreich gestartet, zuerst habe ich neue Anzugbretter mit Unterstützung für aktives Tracking erstellt und wir haben ein Hardware-Update durchgeführt.
Wie ist es ausgegangen?
Seit 3 Jahren haben wir viele Unterhaltungspunkte auf der ganzen Welt eröffnet, aber das Coronavirus hat seine eigenen Anpassungen vorgenommen, die uns die Möglichkeit gaben, die Arbeitsrichtung in eine sozial nützlichere Richtung zu ändern. Wir sind jetzt ziemlich erfolgreich in der Entwicklung von medizinischen Simulatoren in VR. Unser Team ist noch klein und wir bemühen uns aktiv, unsere Mitarbeiter zu erweitern. Wenn erfahrene UE4-Entwickler unter den Lesern von Habr Arbeit suchen, schreiben Sie mir bitte.
Traditioneller lustiger Moment am Ende des Artikels:
Bei Tests mit einer großen Anzahl von Spielern trat von Zeit zu Zeit ein Fehler auf, bei dem der Spieler plötzlich für kurze Zeit auf eine Höhe von mehreren Metern teleportiert wurde, was eine entsprechende Reaktion hervorrief. Es stellte sich heraus, dass mein Kameramodell den Schnittpunkt der Matrix mit einer unendlichen Linie vom Marker aus annahm. Sie berücksichtigte jedoch nicht, dass die Kamera eine Vorder- und eine Rückseite hat, und so suchte das System nach dem Schnittpunkt endloser Linien, selbst wenn sich der Punkt hinter der Kamera befindet. Daher gab es Situationen, in denen zwei verschiedene Kameras zwei verschiedene Markierungen sahen, aber das System dachte, es sei eine Markierung in einer Höhe von mehreren Metern.
Das System hat buchstäblich durch den Arsch gearbeitet.