2009-02-25 15 views
6

Sử dụng OpenGL Tôi đang cố vẽ sơ đồ cơ sở của mình.Cách phóng to, xoay và xoay công việc?

Bất cứ ai có thể giải thích cho tôi cách xoay, thu phóng và xoay thường được triển khai?

Ví dụ: khi xoay và thu phóng, điều đó có đơn giản là tôi điều chỉnh chế độ xem của mình không? Vì vậy, tôi vẽ và vẽ tất cả các đường của tôi tạo bản đồ của tôi và sau đó khi người dùng nhấp và kéo nó điều chỉnh chế độ xem của tôi?

Để di chuyển, nó có thay đổi giá trị x/y của chế độ xem của tôi và để thu phóng không, tăng/giảm chế độ xem của tôi theo một số tiền? Còn về luân chuyển thì sao?

Để quay, tôi có phải thực hiện các biến đổi affine cho mỗi polyline đại diện cho bản đồ khuôn viên của tôi không? Sẽ không tốn kém để làm trên bay trên một bản đồ có kích thước phong nha?

Hoặc, chế độ xem có bị giữ nguyên và xoay/thu phóng/xoay được thực hiện ở một số đường khác không?


Ví dụ, nếu bạn đi đến link này, bạn sẽ thấy anh ấy diễn tả panning và phóng to chính xác làm thế nào tôi có ở trên, bằng cách thay đổi khung nhìn.

Điều này có đúng không?

Trả lời

7

Chúng đạt được bằng cách áp dụng một loạt lệnh glTranslate, glRotate (đại diện cho vị trí và hướng của máy ảnh) trước khi vẽ cảnh. (về mặt kỹ thuật, bạn đang quay toàn bộ cảnh!)

Có các chức năng tiện ích như gluLookAt sắp xếp một số chi tiết về điều này.

Để đơn giản hóa mọi thứ, giả sử bạn có hai vectơ đại diện cho máy ảnh của bạn: vị trí và hướng.

gluLookAt lấy vị trí, điểm đến và vectơ lên.

Nếu bạn triển khai lớp vectơ, destinaion = position + direction sẽ cung cấp cho bạn điểm đến.

lần nữa để làm cho mọi việc đơn giản, bạn có thể giả định lên vector để luôn (0,1,0)

Sau đó, trước khi hoàn trả bất cứ điều gì trong cảnh của bạn, tải các nhận dạng ma trận và gọi gluLookAt

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0); 

Sau đó, bắt đầu vẽ các đối tượng của bạn

Bạn có thể cho phép người dùng mở rộng bằng cách thay đổi vị trí sang phải hoặc sang trái. Rotation phức tạp hơn một chút khi bạn phải xoay vector hướng. Giả sử rằng những gì bạn đang quay là máy ảnh, không phải một số đối tượng trong cảnh.

Một vấn đề là, nếu bạn chỉ có một vector hướng "chuyển tiếp" thì bạn di chuyển nó như thế nào? ở bên phải và bên trái ở đâu?

Cách tiếp cận của tôi trong trường hợp này là chỉ lấy sản phẩm chéo của "hướng" và (0,1,0).

Bây giờ bạn có thể di chuyển camera sang trái và sang phải bằng cách sử dụng một cái gì đó như:

position = position + right * amount; //amount < 0 moves to the left 

Bạn có thể di chuyển về phía trước bằng cách sử dụng "vector hướng", nhưng IMO nó tốt hơn để di chuyển đối tượng một mặt phẳng nằm ngang , do đó, có được véc tơ chuyển tiếp giống như cách chúng tôi đã nhận được đúng véc tơ:

forward = cross(up, right) 

Thành thật mà nói, đây là một cách tiếp cận đáng sợ.

Cách tiếp cận thích hợp là sử dụng cấu trúc dữ liệu "tinh vi" hơn để đại diện cho "hướng" của máy ảnh chứ không chỉ hướng chuyển tiếp. Tuy nhiên, kể từ khi bạn chỉ mới bắt đầu, nó là tốt để có những điều một bước tại một thời điểm.

+2

Hãy để tôi thêm rằng không có điểm nào "khung nhìn" (như được đặt qua glViewport) đi vào quá trình này. Khung nhìn xác định vùng nào của cửa sổ bạn sẽ hiển thị (điều này không thực sự đúng, nhưng hãy nghĩ về nó theo cách này) và thường sẽ kéo dài toàn bộ cửa sổ. – Thomas

1

Thông thường, có ba bước được áp dụng bất cứ khi nào bạn tham chiếu bất kỳ điểm nào trong không gian 3d trong opengl.

Cho một điểm địa phương

  • Local -> Thế Giới Biến đổi
  • Thế giới -> Camera chuyển đổi
  • máy ảnh -.> Screen Transform (thường là một dự báo phụ thuộc vào nếu bạn đang sử dụng quan điểm hoặc trực giao)

Mỗi chuyển đổi này lấy điểm 3d của bạn và nhân với ma trận.

Khi bạn xoay máy ảnh, nó thường thay đổi thế giới -> biến đổi máy ảnh bằng cách nhân ma trận biến đổi bằng phép biến đổi xoay vòng/pan/zoom. Vì tất cả các điểm của bạn được trả lại mỗi khung hình, ma trận mới sẽ được áp dụng cho các điểm của bạn và nó sẽ mang lại sự xuất hiện của một vòng quay.

4

Tất cả các "hành động" này có thể đạt được bằng cách sử dụng chức năng chuyển đổi ma trận xem mô hình. Bạn nên đọc về glTranslatef (panning), glScalef (zoom), glRotatef (rotation). Bạn cũng cần đọc một số hướng dẫn cơ bản về OpenGL, bạn có thể tìm thấy this link hữu ích.