Bất kỳ ai cũng có thể cho tôi một số lời khuyên hoặc gợi ýChuyển động từ 2D sang 3D
Tôi cần tìm một vật thể trong một bức ảnh di chuyển từ vị trí này sang vị trí khác (thực ra tôi cần tính toán bao nhiêu di chuyển giữa 2 hình ảnh nhưng vì đối tượng sẽ vẫn giữ nguyên và chỉ xoay trên trục Y của nó, tôi nghĩ sẽ dễ di chuyển hình ảnh hơn). Khá giống với ví dụ này nhưng không phức tạp lắm.
Vì vậy, tôi lấy bức ảnh đầu tiên của một khối lập phương Rubiks và chọn 4 điểm trên khối lập phương theo các ví dụ ở đây Hình ảnh là một Texture2D và các vòng tròn màu xanh đại diện cho 4 điểm trên khuôn mặt phía trước của khối lập phương được chọn bởi người dùng. 4 điểm này được lưu trữ trong danh sách và hình ảnh tiếp theo được tải như thế này
Một lần nữa người dùng phải chọn 4 điểm của cùng một khuôn mặt như trước (mặt trắng). Sau đó, 4 điểm này được lưu vào danh sách mới.
Vì vậy, bây giờ tôi có hai danh sách và tôi cần phải tính toán "toàn bộ mặt phía trước" đã chuyển bao nhiêu (xoay/quy mô/dịch) so với hình ảnh 1 tới hình ảnh 2 như đây
Nhưng quan trọng hơn , Tôi cần tính toán chuyển động này trong 3D! Vì vậy, đối với hình ảnh đầu tiên tôi giả định rằng thành phần z = 0. Ví dụ: tôi giả sử góc trên cùng bên trái của hình ảnh 1 = ví dụ (10, 10, 0).
Có cách nào mà tôi có thể "giả định" rằng nếu khuôn mặt của hình ảnh 2 đã xoay/thu nhỏ/dịch theo một cách nhất định mà điều này có thể được di chuyển trong không gian 3D? Vì vậy, nếu góc trên bên trái của hình ảnh 2 là bên phải của hình ảnh 1 (bắt đầu hình ảnh) góc trên bên trái, rằng máy ảnh phải di chuyển sang phải. Và như vậy sẽ đi lên hoặc xuống của các điểm? Đối với xoay, tôi có thể tính toán các góc giữa các điểm của hình ảnh 1 và các góc giữa các điểm của hình ảnh 2 và bằng cách nào đó tính toán được bao nhiêu máy quay đã xoay?
Đối với mã của tôi, tôi đã suy nghĩ một cái gì đó như thế này?
// 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, ?));
Đối với phong trào sang trái hoặc phải chỉ tính toán bao nhiêu mỗi điểm đã chuyển
//Translation
Matrix translating = Matrix.CreateTranslation(new Vector3(amountMovedX, amountMovedY, 0));
List<Vector3> imageAfterTranslating = transformListOfVertices(imageAfterScaling, translating);
Và đối với nghiêng (Im một chút khó khăn) ....
// Rotation
Matrix rotation = Matrix.CreateFromAxisAngle(
Vector3.Normalize(new Vector3(?, ?, ?)), MathHelper.ToRadians(?)); // Not sure here
List<Vector3> imageAfterRotation = transformListOfVertices(cube, rotation);
Các điểm có tuân theo bất kỳ quy tắc nào không? giống như tất cả họ phải là đồng minh? – MerickOWA
Yeah cho mục đích của ứng dụng tất cả các điểm sẽ được coi là đồng phẳng. Vì vậy, người dùng chỉ có thể chọn một mặt của khối lập phương và tất cả các điểm đó sẽ được xem là trên một mặt phẳng – heyred