Stap 5: 2de Processing programma
Herinner me al die 3D-vector wiskunde uit school dat je dacht dat je nooit zou gebruiken? We zullen u nog steeds niet hoeft te gebruiken omdat ik het heb gedaan voor u.
In dit laatste deel zullen we een ander Processing schets waarin die witte pixelcoördinaten en hen op het vliegtuig door de lineaire laser gemaakt projecten schrijven. Elke witte pixel wordt een denkbeeldige lijn coming out van de camera in 3D-ruimte. Waar elke lijn met het denkbeeldige laser-vliegtuig snijdt, worden een gegevenspunt getekend. Dit wordt herhaald voor elke witte pixel in elk frame van de webcam, uiteindelijk een 3D puntenwolk opbouwen. Gewoon kijken naar de video...
Het enige deel van de setup die ik hier zal vermelden is de parameter 'rotcam'. Dit is waar u wilt invoegen op de hoek van de webcam, waar 0deg kampt ongecompliceerd, en 90deg is kijken van de laser. Het moet zitten tussen 10 en 40 graden, afhankelijk van wat u scant. Kleine hoeken ver weg voor objecten en grotere hoeken voor close ones.
Om te beginnen met in de lus van de loting moeten we uitbreiden van de vliegtuigen van de knippen met behulp van 'perspectief' is dit ver weg en dingen die zeer close van verdwijnen. Moeten wij 3 lijnen vertegenwoordigen de X-, Y- en z-as te laten rood, groen en blauw te maken.
We kunnen vervolgens onze camera die we gebruiken om de 3D-ruimte rondkijken instellen. We kunt sin en cos samen met de X-positie van de muis op het scherm om een draaitafel effect om weer te geven van het onderwerp gemakkelijker te maken. Spelen rond met deze dienovereenkomstig om iets comfortabel te gebruiken.
Dus nu zijn we springen in de lus die alle de wiskunde doet. Maar we willen alleen wordt uitgevoerd als een toets wordt ingedrukt. Dit betekent dat er alleen om te doen de berekeningen eenmaal in plaats van het herhalen over en voorbij.
Hier moeten we het tekstbestand met de witte pixelcoördinaten laden en opslaan op een tekenreeksvector 'myString'. Eerlijk gezegd, ik weet niet waarom het moet worden een vector, het neemt slechts het eerste element maar weigert om te werken als er alleen een tekenreeks. Oke moeten we dan zijn om het enorme lege float vectoren X, Y- en Z-coördinaten waar elk zal worden gevuld met de overeenkomstige XYZ-component voor elke één gegevenspunt in de puntenwolk.
'myString 'needs worden onderverdeeld in elk frame van de webcam met splitTokens voor';'. Dit heeft herschreven 'myString' als een vector met coördinaten van het ene frame van de camera in elk element.
We kunnen nu springen in een for-lus dat wordt eenmaal herhaald voor elke camera frame opgeslagen in myString.
Daarna nodig hebben wij om een ander tekenreeksvector genaamd 'stringPart', die nog verder 'myString' splitst. Het opsplitsen in persoon X en Y witte pixelcoördinaten nu deel uitmaakt van elk element. Dit is alleen bespaart één frame tegelijk.
De huidige hoek van de motor wordt opgeslagen in 'rotmot' en komt uit het eerste element van de 'stringPart', vector geconverteerd naar een float.
Voor dit volgende beetje is onze 3D ruimte vertrekpunt (0,0,0) het centrum van de de motor schacht op het oppervlak van de arm.
Hier gebruiken we een functie genaamd pushMatrix. Dit wordt gebruikt om onze lokale positie in de 3D-ruimte te wijzigen, in principe verandert het waar het centrum van ons universum 3D is. Wij vervolgens kunt de modelX, Y, Z-functies te vinden van de echte mondiale coördinaten van een punt na pushMatrix vertalingen en rotaties. Zeer nuttig spul! Dus in deze eerste pushMatrix draaien we in Y door de huidige hoek van motoren.
Vervolgens gaan in een andere pushMatrix (een binnen een andere) en vertalen van de motoras centrum langs de arm aan de laser. Hier kunnen we de vergelijking voor de lineaire lasers vlak maken. Als ik zeg laser vliegtuig, spreek ik over een vliegtuig waar de laser kan schijnen op een punt langs het vliegtuig. Dus het vliegtuig door middel van de laser en om het even wat gaat schijnt het op.
Om de vergelijking van het vliegtuig, moeten we twee punten waardoor een lijn loodrecht op het vlak van de laser. Dit is van het vliegtuig normaal VECTOR. De vergelijking is afgeleid van dit en een punt op het vliegtuig.
Vervolgens gebruiken we popMatrix ongedaan maken wat de pushMatrix deed. Wij gebruiken alleen het eenmaal dus we gaan terug naar het centrum van de motoren, maar nog steeds met de transformatie van haar rotatie.
In dit volgende deel werken wij binnen een andere for-lus dat loopt eenmaal voor elke witte pixel, dus de lengte van de stringPart halen maar het doormidden verhogen. Dit is omdat we gebruik wilt maken van X-en Y-coördinaten in deze lus op hetzelfde moment.
We zijn nu bezig met een enkele witte pixel die een afzonderlijk gegevenspunt worden zal. In deze lus moeten we eerst om te zetten van de witte pixel XY-coördinaten in hoeken die fungeren als de XY voor de projectie van de denkbeeldige lijn vanuit de camera's centrum... check hoeken de beelden om te zien wat ik over spreek.
Nu moeten we gebruik van pushMatrix opnieuw te verplaatsen van de as van de motor langs de arm naar het centrum van camera's. Vervolgens draaien we in Y door de camerahoek, we draaien in X en Y opnieuw met behulp van de hoeken die ik beschreven in de laatste alinea. Dus nu zijn onze lokale coördinaten in de camera, die gericht zijn rechtstreeks uit een enkele witte pixel projectie lijn.
Nu we de projectie-lijn op dezelfde manier maken maakten we de normaalvector voor het vliegtuig. Maak een punt op de camera's centrum en een ander punt uit enige afstand langs de lijn van de projectie. Hieruit maken wij de vergelijking voor de lijn.
Hier duiken we de matrix weer terug te keren naar de de motor as met de rotatie van de motor.
Nu we een herschikt versie van de vliegtuig-vergelijking met de vergelijking van de regel ingevoegd in het gebruiken en op te voor 't lossen '. Zie de vergelijking herschikt in de beelden. Vervolgens spul het resultaat voor 't' in de vergelijkingen van de lijn voor XY en Z. Dus nu hebben we onze XYZ coördinaten voor een afzonderlijk gegevenspunt! Duw het in de 'drawpoint'-vectoren die in het bezit van elk punt.
PopMatrix opnieuw terug te keren naar het begin van de wereldwijde coördinatensysteem zonder vertalingen of rotatie transformaties gebruiken.
Dus nu hebben we 3 grote vectoren voor XY en Z-componenten van elke gegevens wijzen maar geen punten voor de puntenwolk eigenlijk nog niet getrokken. Zo kunnen we dat nu doen. Gebruik een for-lus te doorlopen elk gegevenspunt daarmee als lang als 'drawpointX' en in de lus, gebruik ' point(drawpointX[i],drawpointY[i],drawpointZ[i]). Dit percelen een punt op elk snijpunt tussen een witte pixel projectie lijn en de laser-vliegtuig.
Thats it, goed gedaan! Net hit lopen en treffer ieder toonsoort te geven van de scène. Controleer of het bestand dat u probeert te lezen van is opgeslagen in de map van deze schets.