W XNA wyświetlam prosty prostokąt, który jest rzutowany na podłogę. Projektor można ustawić w dowolnym miejscu. Oczywiście rzutowany prostokąt ulega zniekształceniu w zależności od położenia i kąta rzutnika. Kinect skanuje podłogę w poszukiwaniu czterech rogów. Teraz moim celem jest przekształcenie oryginalnego prostokąta, tak aby rzut nie był już zniekształcony przez zasadniczo wstępne wypaczenie prostokąta.
Moje pierwsze podejście polegało na zrobieniu wszystkiego w 2D: Najpierw oblicz transformację perspektywiczną (używając OpenCV warpPerspective()) od skanowanych punktów do wewnętrznych punktów prostokąta i zastosuj odwrotność do prostokąta. Wydawało się, że to działa, ale było zbyt wolne, ponieważ nie mogło być renderowane na GPU.
Drugie podejście polegało na zrobieniu wszystkiego w 3D w celu korzystania z funkcji renderowania XNA. Najpierw wyświetliłem płaszczyznę, zeskanowałem jej narożniki za pomocą Kinect i zamapowałem otrzymane punkty 3D na oryginalnej płaszczyźnie. Teoretycznie mogłem zastosować odwrotność transformacji perspektywy do płaszczyzny, tak jak to zrobiłem w podejściu 2D. Ponieważ jednak XNA działa z matrycą widoku i projekcji, nie mogę po prostu wywołać funkcji takiej jak warpPerspective()i uzyskać pożądanego rezultatu. Musiałbym obliczyć nowe parametry matrycy widoku i projekcji kamery.
Pytanie: Czy można obliczyć te parametry i podzielić je na dwie macierze (widok i rzut)? Jeśli nie, czy istnieje inne podejście, którego mógłbym użyć?
warpPespective? Nie znam OpenCV, ale czytając dokument wygląda na to, że ta funkcja po prostu stosuje perspektywę do obrazu. Czy jestem zdezorientowany? W każdym razie może pomóc dodanie więcej szczegółów na temat pierwszego wdrożenia.
