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.
Więc biorę pierwsze zdjęcie kostki RUBIKS i wybierz 4 punkty na kostce, jak na przykład tutaj 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
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);
Czy punkty muszą spełniać dowolne zasady? jakby wszyscy musieli być koplanerami? – MerickOWA
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