Làm cách nào tôi có thể ngăn không cho khung nhìn bị giãn / biến dạng?


13

Về cơ bản, tôi muốn biết làm thế nào tôi có thể loại bỏ sự biến dạng hoặc kéo dài của hình ảnh được hiển thị khi kích thước khung nhìn / cửa sổ thay đổi.

Những hình ảnh sau đây minh họa cho sự biến dạng / kéo dài mà tôi đang nói đến:

Ảnh gốc (Cửa sổ vuông)

Không biến dạng

Hình ảnh bị bóp méo / kéo dài (Cửa sổ hình chữ nhật)

Với sự biến dạng

Lý tưởng nhất, hình ảnh thứ hai sẽ hiển thị hình cầu mà không kéo dài theo chiều ngang và sẽ phơi bày nhiều cảnh hơn cho người dùng để tính kích thước cửa sổ lớn hơn.

Điều này có thể giải quyết như thế nào?

Tôi đang làm việc với OpenGL để hiển thị hình ảnh và tôi sử dụng phép chiếu phối cảnh thông qua các cuộc gọi:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

Tỷ lệ khung hình width/heightphù hợp với tất cả các tài liệu / hướng dẫn mà tôi đã gặp, vì vậy tôi không hy vọng nó không chính xác. Tuy nhiên, sự nghi ngờ của tôi là nó đang ảnh hưởng đến vấn đề kéo dài.


Sau khi suy nghĩ

Thành thật mà nói, khi tôi nghĩ về vấn đề này nhiều hơn, tôi đã tin rằng giải pháp liên quan đến mối quan hệ tỷ lệ thuận giữa góc fovy (trường nhìn theo hướng y) và tỷ lệ khung hình.

Phép chiếu phối cảnh

Sử dụng hình ảnh trên làm tham chiếu, nếu chiều rộng tăng (gây ra độ căng ngang), có vẻ rất hợp lý khi góc fovy phải tăng để tạo ra độ giãn dọc 'cố định' tỷ lệ của hình ảnh được hiển thị.

Tương tự như vậy, việc giảm chiều rộng đòi hỏi phải giảm góc fovy.

Cập nhật:

Vì vậy, sau khi điều tra thêm về vấn đề này, tôi đã quyết định thay đổi cách tôi thiết lập chế độ xem như thế này:

gluPerspective(60 * (float)window.width/window.height, (float)window.width/window.height, 0.01f, 100.0f)

Và kỳ vọng của tôi là chính xác, điều đó đã giải quyết vấn đề tỷ lệ. Tuy nhiên, nó không đạt được kết quả mong muốn của tôi. Khi chiều rộng cửa sổ tăng lên, hình ảnh được hiển thị sẽ nhỏ hơn (nhưng hình cầu thực sự là hình tròn). Thay vào đó, hình cầu không nên thay đổi kích thước; chỉ số lượng cảnh được hiển thị sẽ thay đổi.

Câu trả lời:


14

Trong thực tế, câu hỏi ban đầu là 1 bỏ đi từ giải pháp.

Mã gốc

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

Mã cố định

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, (float)window.width/window.height, 0.01f, 100.0f)

Vấn đề là đó window.widthwindow.heightlà các số nguyên, khiến cho tỷ lệ khung hình là kết quả của phép chia số nguyên.

Thay đổi một trong các kích thước thành một dấu phẩy làm cho kết quả sử dụng phép chia dấu phẩy động thay thế.

Bởi vì tỷ lệ khung hình bây giờ là chính xác, không còn kéo dài như đã thấy trong bài viết gốc.

EDIT: Mã trong bài viết gốc (và câu trả lời) chỉ đơn giản là mã giả cho các cuộc gọi đến GPU; chương trình thực tế được sử dụng để xuất các hình ảnh trên được viết bằng Java. Đối với những người không làm việc với Java, tôi đã không nghiên cứu để xem liệu phép chia số nguyên / dấu phẩy động có được thực hiện theo cách tương tự không. Bất kể, giải pháp là về việc đảm bảo tỷ lệ khung hình thực sự được tính toán chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.