2011-07-11 27 views
8

Giả sử tôi có một sprite. Hộp giới hạn theo trục của nó (AABB) rất dễ tìm vì tôi biết chiều rộng và chiều cao. Nói rằng tôi xoay nó 45 độ, tôi không nghĩ rằng AABB sẽ đủ lớn để trang trải nó, vì vậy tôi cần một AABB mới. Làm thế nào tôi có thể tính toán hình chữ nhật bounding của một hình chữ nhật xoay? (đưa ra một điểm trung tâm, một góc, và chiều rộng và chiều cao của nó).AABB của sprite xoay?

Lưu ý rằng OpenGL thực hiện xoay vòng nên tôi không có quyền truy cập vào thông tin đỉnh.

Những gì tôi đang cố gắng làm là nhận AABB để tôi có thể thực hiện phép chọn 2D để hiển thị.

Có cách nào để tìm AABB phù hợp với mọi góc độ không?

Cảm ơn

+5

Đối với những người không quen thuộc, có lẽ bạn có thể đề cập đến AABB = "hộp giới hạn theo trục"? –

Trả lời

29

enter image description here

+5

+1: một bức tranh trị giá một ngàn chữ. –

+0

Nếu bạn đi tuyến đường này, hãy nhớ nhớ AABB ban đầu và góc xoay hiện tại, vì nếu bạn áp dụng nhiều hơn và nhiều vòng quay, hộp được sửa sẽ ngày càng lớn hơn (làm cho nó ít hữu ích hơn). Ý tưởng khác trong bài đăng của bạn (tìm một AABB hoạt động cho mọi góc) cũng đủ dễ dàng (xem câu trả lời của tôi). –

+1

lưu ý rằng AABB đã xoay sẽ không phải là một giới hạn tối ưu nói chung trừ phi chính nó là một hình chữ nhật; tôi có nghĩa là, AABB của bạn sẽ nghiêm chỉnh nói "một hộp giới hạn" (nghĩa là: nó được đảm bảo ở bên trong) nhưng có thể có một AABB xoay nhỏ hơn phù hợp với sprite. (ví dụ, nếu có sprite không có điểm gần các góc của AABB) – lurscher

0

Tôi không biết nếu điều này là phương pháp hiệu quả nhất, nhưng tôi sẽ chỉ tính toán các vị trí mới của các đỉnh và dựa trên dữ liệu đó tìm ra AABB. Ví dụ:

Vertex v0, v1, v2, v3; 
// in the local coordinates of the rectangle 
// so for example v0 is always 0,0 and width and height define the others 
// put some values to v0..v3 

glLoadIdentity(); 
glTranslatef(the position of the rectangle); 
glTranslatef(center_point); 
glRotatef(angle, 0,0,1); 
glTranslatef(-center_point); 

GLfloat matrix[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, matrix); 

v0 = multiply_matrix_by_vector(matrix, v0); 
v1 = multiply_matrix_by_vector(matrix, v1); 
v2 = multiply_matrix_by_vector(matrix, v2); 
v3 = multiply_matrix_by_vector(matrix, v3); 

AABB = find_the_minimums_and_maximums(v0, v1, v2, v3); 

Nếu bạn không biết cách nhân một ma trận bằng véc tơ, hãy thử googling nó.

Cũng lưu ý rằng vì kích thước ma trận là 4x4, vectơ cho các đỉnh cũng cần phải là 4 chiều. Bạn có thể chuyển đổi vector 2D thành vector 4D bằng cách thêm thành phần thứ ba 0 (không) và thành phần thứ tư 1 (một). Sau khi phép nhân đã được thực hiện, bạn có thể chuyển đổi vector 4D thu được thành 2D bằng cách chia các thành phần x và y cho thành phần thứ tư và đơn giản bằng cách bỏ qua thành phần thứ ba vì bạn không cần thứ nguyên thứ ba.

Kể từ khi nhân ma trận có thể là một hoạt động xử lý khá nặng, phương pháp này có thể chỉ tốt, nếu bạn không cần cập nhật nhiều AABB thường xuyên.

+1

OpenGL có 'glMultMatrix', vì vậy bạn cũng có thể sử dụng nó. –

+0

có. ngoại trừ glMultMatrix đó có thể làm một số công việc phụ bởi vì nó nhân ma trận bởi ma trận thay vì ma trận bởi vectơ.nhưng đó có lẽ là ok vì phương pháp này có thể là chậm anyway. – kynnysmatto

+0

Bạn đang nhân bốn vectơ với cùng một ma trận 4 × 4, vì vậy bạn có thể thực hiện tất cả chúng cùng một lúc ... –

1

Nếu bạn muốn một hộp duy nhất bao phủ tất cả các góc, chỉ cần lấy nửa đường chéo của ô hiện có của bạn làm bán kính của một vòng tròn. Hộp mới phải chứa vòng tròn này, do đó, nó phải là một hình vuông có chiều dài cạnh bằng hai lần bán kính (equiv. Đường chéo của AABB ban đầu) và với cùng một trung tâm như bản gốc.

Nói chung đối tượng sẽ được xoay quanh một điểm tùy ý, vì vậy bạn phải tính toán vị trí mới của trung tâm và dịch hộp này sang đúng vị trí.

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