2008-11-13 76 views
27

Trong OpenGL, tôi đang cố xoay máy ảnh quanh một điểm, với máy ảnh là khoảng cách r từ điểm và quay về điểm khi nó quay. Nói cách khác, tôi muốn máy ảnh di chuyển dọc theo chu vi của một vòng tròn tại bán kính r từ tâm, với camera hướng về phía trung tâm tại bất kỳ điểm nào dọc theo chu vi.OpenGL xoay máy ảnh quanh một điểm

Cho phép nói rằng trong không gian 3d, tâm của vòng tròn là (3, 0, 3);

Tôi đã thử:

// move to center of circle  
glTranslatef(-3, 0, -3) 
// move a distance away from the circle 
glTranslatef(0, 0, r); 
// rotate along the y "up" axis 
glRotatef(CameraAngle, 0, 1, 0); 

nơi CameraAngle là độ được chuyển xung quanh vòng tròn.

Kết quả cuối cùng của tôi là máy ảnh vẫn đang quay dọc theo nguồn gốc, chứ không phải tâm của vòng tròn. Bất cứ ai có thể giúp tôi khắc phục vấn đề này? Cảm ơn!

Trả lời

24

Bạn cần một trong hai:

  • xoay camera xung quanh nguồn gốc và sau đó dịch nó (*)

hay:

  • sử dụng gluLookAt để giữ cố định camera chỉ vào tâm của hình tròn

(*) chức năng xoay thường xoay về nguồn gốc. Để xoay quanh điểm khác P bạn phải:

  • dịch (-P)
  • xoay
  • dịch (P)
+0

Tôi đã thực hiện điều đó bằng cách sử dụng "nguyên mẫu quaternions" (phương pháp đơn giản trong lớp Vector của tôi xoay vòng một vector khác). trông linh hoạt hơn =) – shybovycha

2

Tôi thấy vấn đề như thế này dễ dàng hơn nhiều để giải quyết với gluLookAt (). Bạn xác định đường dẫn cho máy ảnh (vòng tròn thật dễ dàng!) Và giữ cho điểm "trung tâm" được cố định (nghĩa là điều bạn đang xem).

Bí quyết duy nhất có thể là xác định một véc tơ tốt - nhưng thường không quá nhiều công việc. Nếu đường dẫn và điểm đích nằm trong cùng một mặt phẳng, bạn có thể sử dụng cùng một vector lên mỗi lần!

3

Tại sao phải bận tâm với tất cả sự cố khi xoay camera và không xoay cảnh?
Chuyển tiếp nhanh hơn rất nhiều. chỉ cần xoay ma trận modelview quanh gốc. Bạn sẽ nhận được kết quả chính xác.

+8

Máy ảnh trong trường hợp này được thực hiện bằng cách xoay ma trận chế độ xem mô hình, do đó xoay ma trận modelview cũng giống như xoay máy ảnh. Xoay cảnh liên quan đến việc sử dụng các vị trí đỉnh khác nhau vv ... Tôi nghĩ rằng bài đăng của bạn hơi khó hiểu. – jheriko

10

nó là một chút bối rối, nhưng tôi nghĩ rằng bạn nên:

// move camera a distance r away from the center 
glTranslatef(0, 0, -r); 

// rotate 
glRotatef(angley, 0, 1, 0); 
glRotatef(anglex, 1, 0, 0); 

// move to center of circle  
glTranslatef(-cx, -cy, -cz) 

lưu ý thứ tự KHÔNG phải được thay đổi.

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