Một vật gần gấp đôi xuất hiện lớn gấp đôi?


16

Vì vậy, tôi đã suy nghĩ về việc tạo ra một trò chơi 2D trong đó bạn cũng có thể di chuyển dọc theo trục Z, bằng cách thay đổi bạn đang ở lớp nào. Tùy thuộc vào độ sâu mà tôi muốn chia tỷ lệ các họa tiết 2D của mình.

Một lần, ai đó đã cho tôi xem một bản demo trong đó anh ta có rất nhiều họa tiết 2d, và bằng cách cuộn anh ta có thể thay đổi độ sâu của máy ảnh. Vì vậy, khi phóng to, các đối tượng sẽ đến gần người chơi hơn và xuất hiện lớn hơn. Sau đó tôi tự hỏi, một vật thể nên lớn hơn bao nhiêu khi nó gần 1 đơn vị hơn. Làm thế nào bạn sẽ tính toán điều đó? Vì vậy, anh chàng nói với tôi: Có một quy tắc cơ bản mà tôi đang sử dụng: "các vật thể gần gấp đôi, xuất hiện lớn gấp đôi".

Bây giờ, bằng cách tự kiểm tra nó, tôi biết rằng quy tắc đó không áp dụng trong thế giới thực;) Nhưng có một số hằng được sử dụng trong các tính toán trong thế giới thực cho phối cảnh hay cái gì đó không? Hay một công thức?

Tôi biết đây có thể không phải là nơi tốt nhất để đặt câu hỏi như vậy, nhưng vì đây là trang web duy nhất tôi sử dụng cho các câu hỏi liên quan đến trò chơi và bối cảnh của tôi là một trò chơi, tôi nghĩ tôi nên thử. Ngoài ra, tôi cũng hy vọng rằng có một người ở đây biết mọi thứ về viễn cảnh và ma trận 3D hoặc một cái gì đó, vì nó có thể liên quan đến các trò chơi 3D;)

tl; dr:

"Một vật thể gần gấp đôi, xuất hiện lớn gấp đôi" Điều đó không đúng trong thế giới thực. Nhưng hằng số hay công thức nào là đúng?


3
Tôi không biết câu trả lời là gì nhưng tôi biết làm thế nào tôi có thể tìm ra. Chụp một số hình ảnh của một cái gì đó. Có lẽ là một mảnh giấy. Đưa chúng từ các khoảng cách đã biết khác nhau và sau đó thực hiện một số phép toán để tính toán lượng hình ảnh được chụp bởi mảnh giấy và xác định tỷ lệ theo đó. Có thể là một thử nghiệm thú vị!
SpartanDovy

Tôi đang tự hỏi tại sao không ai đề cập bất cứ điều gì về logarit tự nhiên ...
Chad Harrison

4
Tại sao nó không đúng? Tôi nghĩ đó là sự thật.
Ivan Kuckir

@hydroparadise Logarit tự nhiên phải làm gì với câu hỏi này?
Nathan Reed

Tôi chỉ là người phạm tội ở đây tôi biết, nhưng "Hai lần gần gũi" là một cụm từ kỳ quặc. Không phải là "Một nửa như xa"? "Hai lần" là lớn hơn, nhưng nếu một cái gì đó gần hơn thì khoảng cách sẽ nhỏ hơn.
MrVimes

Câu trả lời:


19

Nói chung là đúng, tùy thuộc vào điểm nhìn của bạn và hướng di chuyển của nó, cũng như góc nhìn.

Ví dụ về quan điểm cho các đối tượng

Lưu ý cách ở chế độ xem camera đầu tiên, vì khối Đỏ vuông góc với chế độ xem camera, đối tượng dường như lớn gấp đôi theo tỷ lệ 1: 2 hoàn hảo (Lưu ý mũi tên chỉ vào cạnh của khung nhìn sau khi được di chuyển gần gấp đôi)

Thứ hai là khối kích thước tương tự xoay ở 45 độ. Khi được xoay, cạnh dưới không còn ở cùng khoảng cách với máy ảnh với cạnh trên, do đó, nó không SEEM tỷ lệ chính xác theo tỷ lệ 1: 2 nhưng thực tế nó lớn gấp đôi (như thực tế là cùng một góc trên khối màu xanh xa hơn như trong khối màu xanh gần.)

Tóm lại, điều này thực sự có nghĩa là bạn của bạn đã đúng và tỷ lệ 1: 1 ("các đối tượng gần gấp đôi, xuất hiện gấp đôi.") Cho các đối tượng của bạn là một lựa chọn tốt.



Câu trả lời chính xác! Những hình ảnh chắc chắn làm cho nó rõ ràng hơn. Thực sự bây giờ tôi cảm thấy thật ngu ngốc, vì tôi đã thử điều này trước khi đăng câu hỏi bằng cách đưa tay ra trước mặt và di chuyển nó lại gần hơn. Và rồi tôi nghĩ: không, nó không có cảm giác to gấp đôi .... Tôi nên đo nó nhanh hơn;) Quan điểm là một điều buồn cười! Ngoài ra, Ifeel như tôi nên có thể tự mình đưa ra những bức ảnh;) Nhưng câu trả lời tuyệt vời! Cảm ơn!
Berry

@Mason Wheeler - Sắp xếp: P
Tom 'Blue' Piddock 16/03/13

8

Một vật thể gần gấp đôi sẽ xuất hiện lớn gấp đôi. Đó là một hệ quả của Định lý Thales và nó đúng trong thế giới thực.

Người ta có thể lập luận rằng Định lý của Thales là công cụ toán học cốt lõi đằng sau phép chiếu phối cảnh và những gì được biết đến trong đường ống đồ họa (OpenGL hoặc DirectX) là phân chia phối cảnh . Đó là một định lý bạn chắc chắn nên biết và học cách nhận biết khi nào nó có thể được sử dụng.


Tài liệu tham khảo tuyệt vời! Tôi chắc chắn sẽ kiểm tra Định lý Thales, và cố gắng hiểu đường ống đồ họa tốt hơn.
Berry

7

Trên thực tế điều đó khá đúng (nếu bạn di chuyển một vật thể xa gấp đôi, nó trông to bằng một nửa) nhưng nó che khuất kích thước hình ảnh của các vật thể sẽ thay đổi như thế nào khi người xem di chuyển. Cụ thể, các vật thể xuất hiện để lớn hơn nhanh hơn khi chúng ở gần hơn. Đó là bởi vì người xem bao phủ một nửa khoảng cách nhanh hơn rất nhiều khi đối tượng ở gần, so với khi đối tượng ở xa hơn. Hoặc nói cách khác, trong khi tốc độ của người xem là không đổi, giá trị "một nửa khoảng cách" thay đổi khi khoảng cách đến đối tượng thay đổi.


2

Vì bạn không thực sự làm việc trong không gian 3D, chúng tôi có thể giả sử các họa tiết không bao giờ xoay (xoay có thể được mô phỏng bằng xiên, v.v.) Ràng buộc đơn giản này giúp dễ dàng có được các số chính xác về kích thước nên tùy thuộc vào khoảng cách từ camera.

Trước tiên, bạn cần hiểu cách hiển thị các đối tượng 3D. Mặc dù một camera hội tụ đến một điểm duy nhất, có một mặt phẳng vô hình hoạt động như một màn hình để vẽ các vật thể. Điều duy nhất bạn cần biết về màn hình là nó cách camera bao xa.

Dưới đây là sơ đồ về cách một đối tượng được kết xuất với máy ảnh ở hai khoảng cách khác nhau.

Như bạn mong đợi, chiều cao của vật thể phụ thuộc vào khoảng cách từ camera. NHƯNG kể từ khi rending xảy ra trên mặt phẳng gần, chúng ta phải tính chiều cao của sprite tại điểm đó.

Một số tính toán cơ bản sẽ dẫn bạn đến công thức sau:

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

THÍ DỤ:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

Tôi sẽ đề nghị bắt đầu với v=5và sau đó điều chỉnh từ đó dựa trên giao diện của nó. Tôi có thể ném một câu đố với nhau cho phép bạn thấy những thay đổi trong thời gian thực.

TL; DR

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

EDIT: Khi bạn nói di chuyển dọc theo trục z Tôi cho rằng bạn sẽ muốn có chế độ xem phối cảnh (giống như hầu hết các trò chơi 3D; game bắn súng, v.v.) Toán học để tính kích thước đối tượng dựa trên khoảng cách cũng sẽ phụ thuộc vào vị trí trong khung, Tương tự như tầm nhìn ngoại vi. Thay vào đó, tôi sẽ thử nó với toán học của mình, đó là một cái nhìn chính tả (nghĩ rằng Mario, Angry Birds, Super Smash Bros, v.v.). Tôi không biết vẻ ngoài và cảm giác mà bạn đang cố gắng đạt được, nhưng miễn là nó có thật thì người chơi sẽ không bao giờ biết!

BẢN GIỚI THIỆU!


Vâng, tôi thực sự đang hướng đến một cái nhìn chính tả. Trò chơi tôi đang "mượn" nguồn cảm hứng hiện tại của tôi là Rayman Origins. Trong một số phần của trò chơi, bạn có thể nhảy lên những bông hoa, và sau đó bạn sẽ nảy trong một lớp khác với độ sâu khác. Sau đó, camera phóng to hoặc thu nhỏ độ chính xác đến độ sâu đó. Axamples có thể được nhìn thấy trong video này , lúc 4:50 và 5:00.
Berry

Hơn nữa, câu trả lời tuyệt vời! Nhưng vì chỉ cần một xác nhận rằng quy tắc "gần gấp đôi, lớn gấp đôi" được áp dụng là đủ, tôi đã chọn câu trả lời của Blue là tốt nhất.
Berry

Cảm ơn bạn, và chúc may mắn với trò chơi của bạn! Nhưng tôi muốn làm rõ cho những người khác rằng "gần gấp đôi, lớn gấp đôi" sẽ hoạt động rất tốt nếu mọi thứ rất gần với máy ảnh. Khi mọi thứ càng đi xa, sự thay đổi về kích thước sẽ giảm đi. Ví dụ, nhìn ngón tay cái của bạn lên gần, sau đó mở rộng cánh tay của bạn và nhìn vào nó. Kích thước của ngón tay cái của bạn xuất hiện nhỏ hơn đáng kể. Sau đó, nhìn vào một cái gì đó xa. Lùi một bước về phía sau (tương đương với chiều dài cánh tay của bạn). Chú ý kích thước hầu như không thay đổi? Nếu một trò chơi có tầm nhìn dài, sử dụng một chút toán học sẽ đi một chặng đường dài.
Jim Buck

EDIT: Tôi đã phạm sai lầm trong bình luận trước đây của tôi. "Hai lần gần, lớn gấp đôi" là chính xác khi các mục vẫn khá gần nhau đối với khoảng cách của chúng với máy ảnh.
Jim Buck

Dưới đây là bản demo nhanh tôi ghép lại, sử dụng chuột để di chuyển và bánh xe cuộn để thay đổi độ sâu.
Jim Buck

0

Điều này không được bảo hiểm và tôi nghĩ rằng điều này có thể có lợi: Cần lưu ý khi bạn giảm một nửa khoảng cách, nhân đôi kích thước ở cả hai kích thước X và Y sẽ tăng gấp bốn lần tổng diện tích của sprite. Điều này là do:

Area = X * Y

Sau khi phóng to:

NewArea = (x*2) * (y*2)

Điều này có thể cho bạn cảm giác rằng hiệu ứng phóng to đang diễn ra nhanh chóng hoặc quá dữ dội. Thay vào đó, bạn có thể điều chỉnh hệ số bằng cách thay đổi 2 trong công thức trên thành giá trị nổi như 1,5 hoặc 1,33.

Ngoài ra, những gì tôi đã làm là lưu trữ độ sâu camera (khoảng cách) cho các ô của bạn trong một giá trị byte cùng với bản dịch camera (X và Y) sau đó tính toán kích thước ô chiếu như vậy:

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

Lưu ý rằng CameraZphải nghiêm ngặt trong khoảng 1-255 và hạn chế đó có thể là một lợi ích hoặc lợi ích cho bạn trong tương lai.

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.