2012-04-04 18 views
16

Czy ktoś może dać mi jakieś rady lub sugestieRuch z 2D do 3D

Muszę znaleźć ile obiekt na zdjęciu ma przejść z jednej pozycji do drugiej (no faktycznie muszę obliczyć, ile aparat ma przesunięty pomiędzy dwoma obrazami, ale ponieważ obiekt pozostanie nieruchomy i po prostu obrócony na osi Y, myślę, że łatwiej będzie przesunąć obraz). W zasadzie taki sam jak ten przykład, ale nie aż tak skomplikowany. enter image description here

Więc biorę pierwsze zdjęcie kostki RUBIKS i wybierz 4 punkty na kostce, jak na przykład tutaj enter image description here Obraz jest Texture2D i niebieskie koła reprezentuje 4 punkty czołowej kostka wybrana przez użytkownika. Te 4 punkty są zapisywane na liście, a następnie ładowany jest następny obraz, który wygląda tak, jak ten. Ponownie użytkownik musi wybrać 4 punkty tej samej twarzy co poprzednio (biała twarz). Następnie te 4 punkty są zapisywane na nowej liście.

Więc teraz mam dwie listy i muszę obliczyć, ile „twarzą przedni całości” został przeniesiony (obrócić/skala/przetłumaczyć) z obrazem 1 na obrazie 2, jak pokazano tutaj enter image description here

Ale ważniejsze , Muszę obliczyć ten ruch w 3D! Tak więc dla pierwszego obrazu zakładam, że z-component = 0. Na przykład zakładam lewy górny róg obrazu 1 = np. (10, 10, 0).

Czy istnieje sposób, aby "założyć", że jeśli twarz obrazu 2 została obrócona/przeskalowana/przetłumaczona w określony sposób, to można to przenieść w przestrzeni 3D? Jeśli lewy górny róg obrazu 2 znajduje się po prawej stronie obrazu 1 (obraz początkowy) w lewym górnym rogu, kamera musi się przesunąć w prawo. I to samo dotyczyłoby punktów w górę lub w dół? Co do rotacji, czy mógłbym obliczyć kąty między punktami obrazu 1 a kątami między punktami obrazu 2 i jakoś obliczyć, ile kamera obróciła?

Dla mojego kodu myślałem coś takiego?

// Image 1 coordinates for the front face 
// Assume z = 0 
cube1 = new List<Vector3>(); 
cube.Add(new Vector3(10, 10, 0)); 
cube.Add(new Vector3(20, 10, 0)); 
cube.Add(new Vector3(10, 20, 0)); 
cube.Add(new Vector3(20, 20, 0)); 

// Get image 2 coordinates 
cube2 = new List<Vector3>(); 
cube.Add(new Vector3(newX, newY, ?)); // Keep Z = 0? 
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 
cube.Add(new Vector3(newX, newY, ?)); 

Dla ruchu w lewo lub w prawo po prostu obliczyć, ile każdy punkt został przeniesiony

//Translation 
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, amountMovedY, 0)); 
List<Vector3> imageAfterTranslating = transformListOfVertices(imageAfterScaling, translating); 

a dla pochylać (Im nieco zatrzymany) ....

// Rotation 
Matrix rotation = Matrix.CreateFromAxisAngle( 
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?)); // Not sure here 
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation); 
+1

Czy punkty muszą spełniać dowolne zasady? jakby wszyscy musieli być koplanerami? – MerickOWA

+0

Tak dla celów wniosku wszystkie punkty będą uważane za współpłaszczyznowe. Zatem użytkownik może wybrać tylko jedną ścianę sześcianu, a wszystkie te punkty będą uważane za znajdujące się na jednej płaszczyźnie – heyred

Odpowiedz

2

świata matrycę * widok matrycy (kamery) * rzutowanie (kamery) = macierz transformacji

Zakładając, że kostka 1 = pozycja początkowa.
co dzieje się podczas renderowania to: matryca cube1 * transformMatrix = wyjście

Jeśli rozumiem skorygować: Twój wkład pozwala użytkownikowi na zmianę matrycy aparatu (Widok) tylko,
(a kamera = view * projekcja) I chcesz dowiedzieć się nowej transformacji kostki po aktualizacji aparatu.

Więc trzeba zrobić operację inwertowanego:

outputmatrix/transformMatrix = matryca cube1 (nowy będzie trzeba)

z nowej macierzy wynikowej cube1 można wyodrębnić kątów, przepływu oraz itp.

Twój problem jest więc bardziej związany z "co" do wdrożenia - nie jak wdrożyć.
(jak widzę ty familir z poleceniami i kodem, których potrzebujesz)

Mam nadzieję, że to pomoże.

Powiązane problemy