3D-miljö Laser Scanner från början (5 / 7 steg)
Steg 5: 2. bearbetningsprogram
Kom ihåg alla att 3D vektor matematik från skolan du trodde du skulle aldrig använda? Vi kommer du fortfarande behöver inte använda det eftersom jag har gjort det för dig.
I denna sista del kommer vi skriva en annan bearbetning skiss som tar de vita bildpunktskoordinater och projekt dem på planet skapad av linjära laser. Varje vit pixel blir en tänkt linje från kameran i 3D-rymden. Där varje linje skär med imaginära laserplanet, ritas en datapunkt. Detta upprepas för varje vit pixel i varje webcam ram, så småningom bygga upp en 3D punktmoln. Bara titta på videon...
Den enda del av den setup jag ska nämna här är parametern "rotcam". Det är där du ska infoga vinkeln på webbkameran, där 0deg är vänd rakt fram och 90deg tittar på lasern. Det ska sitta mellan 10 och 40 grader beroende på vad du skannar. Små vinklar för långt bort objekt och större vinklar för nära och kära.
Till att börja med i lottningen slingan vi behöver expandera de klippning plan med "perspektiv" är detta långt bort och nära ting från försvinna. Vi måste skapa 3 rader för att representera X, Y och z-axeln och gör dem röda, gröna och blå.
Därefter kan vi ställa in vår kamera som vi använder för att titta runt i 3D-rymden. Vi kan använda sin och cos tillsammans med musens X-position på skärmen för att skapa en skivspelare effekt för att visa ämnet lättare. Leka med detta följaktligen för att få något bekväm att använda.
Så nu vi hoppar in i en slinga som gör alla matematik. Men vi vill bara ha den att köra om någon knapp trycks. Detta innebär att den bara har att göra beräkningar en gång istället för att upprepa om och om igen.
Här måste vi läsa in textfilen med vit pixel koordinaterna och spara den på en sträng vektor "myString". Ärligt talat, jag vet inte varför det måste vara en vektor, det tar bara upp det första elementet men det vägrar att arbeta om det är bara en sträng. Okej behöva vi då göra massiva Tom float vektorer för X, Y och Z koordinater där varje kommer att fyllas med komponenten motsvarande XYZ i varje enskild datapunkt i punktmoln.
'myString 'needs delas i varje webcam ram med hjälp av splitTokens för';'. Detta har omskrivna "myString" som en vektor med koordinater från en kamera ram i varje element.
Vi kan nu hoppa in i en for-loop som upprepas en gång för varje kamera bild sparas i myString.
Sedan behöver vi göra en annan sträng vektor kallas "stringPart" som delar 'myString' upp ytterligare. Det delar det in i individ X och Y vit bildpunktskoordinater som nu finns i varje element. Detta är bara sparar en bildruta i taget.
Motorns aktuella rotationsvinkel sparas i "rotmot" och kommer från det första elementet i den 'stringPart', vektor konverteras till ett flyttal.
För denna nästa bit är vår 3D-rymden startpunkt (0,0,0) centrum av motoraxeln på ytan av armen.
Här använder vi en funktion som kallas pushMatrix. Detta används för att ändra våra lokala position i 3D-rymden, det ändrar i grunden där i mitten av vårt 3D universum är. Vi kan sedan använda funktionerna modelX, Y, Z för att hitta verkligt globala koordinaterna för en punkt efter pushMatrix översättningar och rotationer. Mycket användbara grejer! Så inom denna första pushMatrix rotera vi i Y av motorer nuvarande vinkeln.
Vi går in i en annan pushMatrix (en i en annan) och översätta från motoraxelns centrum längs armen till lasern. Här kan vi skapa ekvationen för linjära lasrar planet. När jag säger laserplan, talar jag om ett plan där Lasern kan lysa på någon punkt längs planet. Så planet går genom laser och genom allt lyser det på.
För att göra plan ekvationen, behöver vi två saker som gör en linje vinkelrätt mot fordonets laser. Detta är planets NORMAL VEKTOR. Ekvationen härstammar från detta och en punkt på planet.
Vi använder sedan popMatrix för att ångra vad pushMatrix gjorde. Vi bara använda den en gång så vi åker tillbaka till stadens motorer men fortfarande med sin rotation omvandling.
Denna nästa del arbetar vi inom en annan for-loop att körs en gång för varje vit pixel, så gör det längden på stringPart men ökar den i två. Detta beror på att vi vill använda X och Y-koordinater i denna slinga på samma gång.
Så nu arbetar vi med en vit pixel som kommer att bli en enstaka datapunkt. I denna slinga måste först aktivera vit pixel XY-koordinater i vinklar som fungerar som XY vinklar för imaginära projektion raden ur kamerans centrum... kolla bilderna för att se vad jag pratar om.
Nu måste vi använda pushMatrix igen och flytta från motoraxeln längs armen till stadens kameror. Sedan vi rotera i Y av kamerans vinkel, och slutligen vi rotera i X och Y igen med vinklar jag beskrev i förra stycket. Så nu är våra lokala koordinater i kameran, siktar rakt ut längs en enda vit pixel projektion linje.
Nu gör vi raden projektion på samma sätt gjorde vi den normala vektorn för planet. Göra en punkt i kamerans centrum och en annan punkt ut en bit längs linjen, projektion. Från detta vi ekvationen för linjen.
Här pop vi matrisen igen för att återgå till motoraxeln med motorns rotation.
Nu vi använder en ordnas version av planet ekvationen med ekvationen för den linje som infogas i det och lösa 't '. Se ekvation ordnas i bilderna. Sedan grejer resultatet för 't' i rad ekvationer och Z. Så nu har vi våra XYZ-koordinater för en enstaka datapunkt! Stoppa i "drawpoint" vektorer som håller varje punkt.
Använd popMatrix igen för att återgå till början av det globala koordinatsystemet utan översättningar eller rotation transformationer.
Så nu har vi 3 enorma vektorer för XY och Z komponenter för alla data pekar men faktiskt inte har dragit någon poäng för punktmoln. Så kan vi göra det nu. Använda en for-loop gå igenom varje datapunkt att göra den så länge som 'drawpointX' och i slingan, använda ' point(drawpointX[i],drawpointY[i],drawpointZ[i]). Detta tomter en punkt vid varje korsning mellan en vit pixel projektion linje och laserplanet.
Det är det, bra gjort! Tryck bara kör och tryck på valfri tangent om du vill återge scenen. Kontrollera att filen du försöker läsa från sparas i mappen för denna skiss.