2012-04-04 43 views
16

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. enter image description here

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 enter image description here 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 enter image description here 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 enter image description here

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); 
+1

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

+0

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

Trả lời

2

ma trận trên thế giới * xem ma trận (của máy ảnh) * phép chiếu (của máy ảnh) = biến đổi ma trận

Giả sử rằng khối 1 = vị trí ban đầu.
Điều gì xảy ra trong thời gian render là: cube1 * transformMatrix = đầu ra ma trận

Nếu tôi hiểu bạn khắc phục: đầu vào của bạn cho phép người dùng thay đổi ma trận camera (view) mà thôi,
(và camera = view * chiếu) Và bạn muốn tìm ra sự biến đổi mới của khối lập phương sau khi máy ảnh được cập nhật.

Vì vậy, bạn cần phải thực hiện hành động nghịch:

outputmatrix/transformMatrix = ma trận cube1 (mới mà bạn sẽ cần)

từ ma trận kết quả cube1 mới, bạn có thể trích xuất các góc, di chuyển và vv ..

Vì vậy, vấn đề của bạn có liên quan nhiều hơn đến "những gì" để triển khai - không phải cách triển khai.
(như tôi thấy bạn familir với các lệnh và mã bạn cần)

Tôi hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan