Proiectul permite scanarea unor obiecte si transformarea lor in modele OBJ ce pot fi integrate in jocuri video sau animatii 3D.
Scopul proiectului este de a reduce timpul si costul de dezvoltare a jocurilor video prin eliminarea nevoii de a modela de la zero diferitele elemente necesare. Astfel, si cei care nu au cunoștiinte de modelare 3D sau talent artistic pot crea rapid modele pentru jocurile lor.
Scannerul foloseste un senzor laser pentru a măsura distanța față de obiect. Prin colectarea distanțelor din mai multe unghiuri și de la înălțimi diferite, se creează un point cloud care este apoi convertit într-un fișier OBJ.
Pentru rotirea obiectului și pentru mișcarea pe verticală a senzorului laser se utilizează două motoare stepper, pentru a avea o precizie cât mai mare. Motoarele sunt controlate cu ajutorul a 2 plăci DRV8825.
Senzorul laser trimite măsurătorile către placa Arduino prin I2C, iar Arduino comunică cu PC-ul prin interfața serială și biblioteca PySerial.
Aplicația de pe PC primește de la Arduino numărul de pași efectuați de fiecare motor și distanța măsurată, date care sunt convertite în coordonate cilindrice pe baza unui fișier de configurare bazat pe datele tehnice ale componentelor. Pentru motoarele utilizate, 200 de pași corespund cu o rotație completă de 360 de grade, iar o rotație completă înseamnă 8mm pentru mișcarea pe verticală a ansamblului senzorului. Coordonatele cilindrice sunt transformate în coordonate carteziene pe baza cărora se creeaza un fișier point cloud în format .ply, care este apoi convertit într-un mesh 3D folosind biblioteca Open3D.
Arduino trimite datele catre laptop, impreuna cu anumite coduri cu diferite semnificatii:
Centrul de referinta al modelului este centrul platformei pe care sta acesta. Centrul se afla la o distanta cunoscuta D fata de senzor. Senzorul intoarce distanta d1 de la marginea obiectului la senzor. Pe baza acestor doua distante, putem calcula distanta de la centru la marginea obiectului scazand D - d1.
Specificatiile motoarelor folosite arata ca 200 de pasi de rotatie corespund cu o rotatie completa de 360 de grade. Astfel, se calculeaza unghiul din care este privit obiectul prin regula de 3 simpla. Pentru deplasarea pe verticala, specificatiile arata ca o rotatie completa a unui motor corespunde cu o deplasare verticala de 8mm.
Astfel, prin aceste 3 masuratori am obtinut pozitia punctului de pe obiect in coordonate cilindrice. Acestea sunt transformate in coordonate carteziene si scrise intr-un fisier .ply
Repository GitHub: https://github.com/John-Ted/Scanner-3D-PM
Proiectul executa scanari, insa faptul ca obiectul este vazut doar din lateral, problemele cu senzorul si algoritmii de conversie din point cloud in mesh 3D nu permit o rezolutie extraordinara.
Proiectul are potential, creeaza modele 3D, insa mai trebuie lucrat pentru imbunatatirea rezolutiei rezultatelor
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.